QML知識-使用Qt訊號和方法
阿新 • • 發佈:2018-12-25
在實際中開發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: 640
height: 480
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