mynameislinduan

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

相关文章: