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

猜你喜欢

转载自blog.csdn.net/nicai_xiaoqinxi/article/details/85107954