前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QML知识-使用Qt信号和方法

QML知识-使用Qt信号和方法

作者头像
Qt君
发布2019-07-16 14:13:41
1.7K0
发布2019-07-16 14:13:41
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

在实际中开发QML应用,会经常用到信号这一属性。像onClicked,onDoubleClicked是异步操作,它们多由信号触发完成。有时候需要与Qt/C++进行数据通信时候,使用Qt的信号机制往往可以提高编程效率的效果。

1. 自定义TestModel类

(1) 使用Q_INVOKABLE可以将test函数标记到qml中使用;

(2) 信号(statusChanged)的定义也可以在qml中使用,参数str可以在qml的信号响应中直接使用。

代码语言:javascript
复制
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中

代码语言:javascript
复制
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)引用即可。

代码语言:javascript
复制
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是所属对象初始化完成后自动执行。

代码语言:javascript
复制
This is test program.
qml: status Changed
This is test program.
qml: status Changed
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档