1. 程式人生 > >QML知識-使用Qt訊號和方法

QML知識-使用Qt訊號和方法

    在實際中開發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