qml例子,qml筆記,qml用法


qml 4G
4G qml
qml demo
qml例子
qml例程
qml框架
如何使用qml
linux qml用法
linux qml寫法
添加qml
linux qml筆記
linux qml記錄
linux qml使用方法
linux qml添加方法
添加qml
qml編碼方法
如何添加qml
如何編寫qml
linux qml調用c++
linux qml和qt聯用
linux qml全局變量
linux qml模板
linux qml都是大駝峰命名方式。

 

1. 首先創建一個文件夾,里面有你的qml程序和c++程序,例如:My4Gtools.cpp, My4Gtools.h, My4Gtools.pri, My4Gtools.qml,圖片資源等(注意qml文件,變量都是大駝峰命名方式,不能數字開頭)
在pri文件中,指定你的qml和c,和資源文件。

A. my4Gtools.pri中的寫法:
HEADERS += \
$$PWD/my4Gtools.h

SOURCES += \
$$PWD/my4Gtools.cpp

RESOURCES += \
$$PWD/my4Gtools.qrc

 

2. 編寫c++和qml程序,可以先隨便寫個簡單的模板,寫好函數和接口,什么都不用實現,后面寫程序中再根據自己情況慢慢實現各個細節需求。
例如,系一個c++類,寫一個簡單構造函數,一個成員函數。
qml文件就隨便,寫一個Rectangle 即可:
Rectangle {
id: tools4G;
visible: true;

MessageDialog { id: messageDialog; title: "提示"; visible: false; icon : StandardIcon.Warning}
MouseArea{ anchors.fill: parent }


3.在最頂層,主項目的,Qt的pro文件中:
QT += qml quick ... ## 不要忘記添加qml功能,否則不能使用qml
...
...
...
include(my4Gtools/my4Gtools.pri) ## 添加我們要加入到qml文件pri,之后,qt creteor會自動更新添加文件,項目界面自動會刷新,你可以看到你新加入到東西了。


4. 在工程的主要入口,cpp文件中, 添加頭文件,注冊qml等:
#include "my4Gtools/my4Gtools.h"
...
...
qmlRegisterType<My4GTool>("may.qt.My4Gtool", 1, 0, "My4Gtool");//注冊qml,在其他qml中,就可以導入你的qml了,

QQuickView viewer;//在最后顯示使用這個viewer
...
...
viewer.show();

 

5. 我是有一個總的qml,主頁main.qml,在main.qml中,點擊按鈕,從而調用我自己新的qml : My4Gtool.qml:
首先在main.qml中,寫入創建一個按鈕,按鈕貼上圖:
Button {
id: my4GBt;
width: g_configs.getSizeInfo("desktopBt_wide");
height: g_configs.getSizeInfo("desktopBt_high");

Image {
width: parent.width; height: parent.height;
source: (my4GBt.pressed) ? "/ico/desktop_ico/my4G_click.png" : "/ico/desktop_ico/my4G.png";//載入圖片資源,用來做圖標的,做點擊顯示效果,包括按下和彈起的兩張圖片
}

onClicked: {
console.debug(qsTr('4G is click'));
subWidowLoader.source = "";
subWidowLoader.source = "qrc:/my4Gtools/my4Gtools.qml";
subWidowLoader.z = 1;
}
}

 

6.qml中調用c++的函數/成員。
A. 在c++源碼h中,定義你的類成員函數,例如:Q_INVOKABLE QString getTtyUsbInfo(void); 其中,Q_INVOKABLE 表示你能在qml中調用,getTtyUsbInfo就是能在qml中調用的函數了。
B. import may.qt.My4Gtool 1.0 在你的qml中,引入這個類。之前在4步中,qmlRegisterType注冊過之后就可聲明,不注冊會報錯。
C. 在qml中,聲明你的c++中的類(之前在4步中,qmlRegisterType注冊過之后就可聲明,不注冊會報錯),注意大駝峰的命名方式,否則qml報錯:

My4Gtool {
id: my4GtoolClass;
}

D. 在qml中使用我的c++函數: my4GtoolClass: recvText.append(my4GtoolClass.getTtyUsbInfo());
E. 成員之際調用,不用聲明Q_INVOKABLE 。

7. c++信號發送到qml:
A. 老樣子,老規矩,正常的在你的c++文件中定義qt信號, 例如:signal canReturnMsg(string msg);//qml信號小駝峰,記住信號小駝峰,qml中,響應的槽:OnCanReturnMsg, 槽要加多一個On,而且變成大駝峰。坑爹吧!我艹。
B. 在c++中發送信號,老樣子發送,在qml中,也是一樣的定義信號,發送信號,例如,qml中:
signal canReturnMsg(string msg);
onClicked: {
emit: canReturnMsg("return");//幾乎和qt c++一樣發送,但是特么的多了個冒號!!
}
C. qml中接收??
Connections {
target: my4GtoolClass;
onCanReturnMsg :{
if(msg === "return") xxxxx//直接可以判斷xx,傳入參數msg直接飲用就行了
}
}

除了上面的直接應用參數,還有個不好理解的,也是比較坑的定義Q_PROPERTY,就是要在c++頭文件中定義:
Q_PROPERTY(QString recv READ getdata NOTIFY recvdataChanged)//當有信號recvdataChanged的時候,從getdata函數中,讀取recv(這個recv隨便寫的!getdata返回的一定你要對上recv類型),然后,重點來了,你可以直接在qml中直接通過類uartclass引用recv,例如: xxTect=uartclass.recv,也就是在類頭文件中,相當於少定義了一個成員同時聲明了聯系。
Q_PROPERTY(bool focus READ hasFocus); //從 hasFocus 讀取focus的值,這個focus也是即興自定義的。在qml中,通過類引用即可!
Q_PROPERTY(enabled READ isEnabled WRITE setEnabled);// 從 isEnabled取值到enable 然后寫入 setEnabled

8. qml中添加全局的類/全局變量,可以在任意一個qml中引用:
A. 首先,添加一個類,我想這個類的實例可以全局訪問,單例模式添加。
Q_INVOKABLE static MayConfigs* getInstance()
{
static MayConfigs *m_configs;
if(m_configs == NULL){
m_configs = new MayConfigs;
}
return m_configs;
}
B. 在main.cpp中開始實例化這個類:
MayConfigs *g_configs = MayConfigs::getInstance();
if(g_configs == NULL){
qDebug("can't init configs");
}

C. 在main.cpp中聲明,這個類可以全局引用:

QQuickView viewer;
viewer.rootContext()->setContextProperty("g_configs", MayConfigs::getInstance());//這個是單例模式
//普通模式:
MayHotPlugMonitor *g_hotplug = new MayHotPlugMonitor(xxx);
...
...
viewer.rootContext()->setContextProperty("g_hotplug", g_hotplug);

之后,你就可愉快的飲用這個玩意了!而且不用import xxx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM