在实际中开发QML应用,会经常用到信号这一属性。像onClicked,onDoubleClicked是异步操作,它们多由信号触发完成。有时候需要与Qt/C++进行数据通信时候,使用Qt的信号机制往往可以提高编程效率的效果。
1. 自定义TestModel类
(1) 使用Q_INVOKABLE可以将test函数标记到qml中使用;
(2) 信号(statusChanged)的定义也可以在qml中使用,参数str可以在qml的信号响应中直接使用。
class TestModel : public QObject
{
Q_OBJECT
public:
explicit TestModel(QObject *parent = nullptr) : QObject(parent) {}
Q_INVOKABLE void test()
{
// TODO ...
qDebug()<<"This is test program.";
emit statusChanged("status Changed");
}
signals:
void statusChanged(QString str);
};
2. 将TestModel注册到qml中
qmlRegisterType<TestModel>("TestModel", 1, 0, "TestModel");
3. 在qml中生成实例TestModel使用
(1) TestModel为C++注册到qml中的实例;
(2) 使用C++中响应信号可以这样写onxxx(xxx为首字母大写的信号名称);
(3) 直接使用信号传递的属性(str);
(4) 由于TestModel使用Q_INVOKABLE标记了test函数,则qml中可以直接使用;
(5) 如需要外部使用test()方法只需要使用对象名字(testModel)引用即可。
Window {
visible: true
width:
height:
title: qsTr("Hello World")
TestModel {
id: testModel
onStatusChanged: {
console.log(str)
}
Component.onCompleted: test()
}
Component.onCompleted: testModel.test()
}
4. 程序输出
(1) 带"qml:"前缀的是QML系统额外加上的;
(2) 可以看到它们成对的出现,原因是调用了两次test函数;
(3) Component.onCompleted是所属对象初始化完成后自动执行。
This is test program.
qml: status Changed
This is test program.
qml: status Changed