前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QML知识-与Qt数据交互

QML知识-与Qt数据交互

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

使用Qml编程时,常常会与Qt之间进行数据访问或修改,本篇文章是介绍Qt与Qml的数据交互方法,一般有两种方法。

代码语言:javascript
复制
#ifndef TESTMODEL_H
#define TESTMODEL_H

#include <QObject>

class TestModel : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY statusChanged)
public:
    explicit TestModel(QObject *parent = nullptr) : QObject(parent) {}
    QString text() { return "test"; }

    void setText(QString text) {
        m_text = text;
        emit statusChanged();
    }

signals:
    void statusChanged();

private:
    QString m_text;
};

#endif // TESTMODEL_H

TestModel头文件

代码语言:javascript
复制
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>

#include "TestModel.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    qmlRegisterType<TestModel>("TestModel", , , "TestModel");

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("testModel", new TestModel());
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

main函数

1. 使用qmlRegisterType注册到qml

(1) 例:

代码语言:javascript
复制
qmlRegisterType<TestModel>("TestModel", 1, 0, "TestModel");

(2) qml中使用方法:

代码语言:javascript
复制
TestModel { id: test }

Column {
    Text { text: "[1]" + test.text }
}

MouseArea {
    anchors.fill: parent
    onClicked: test.text = "123"
}

(2) 通过qml创建控件一样创建实例来访问或修改数据;

(3) TestModel为继承QObject的C++对象,通过访问或修改TestModel的text来达到程序的目的。

2. 使用setContextProperty方法设置qml全局访问属性

(1) 例:

代码语言:javascript
复制
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("testModel", new TestModel());

(2) qml中使用方法:

<1> qml文件执行导入命令

代码语言:javascript
复制
import TestModel 1.0

<2> 使用

代码语言:javascript
复制
Column {
    Text { text: "[2]" + testModel.text }
}

MouseArea {
    anchors.fill: parent
    onClicked: testModel.text = "123"
}

(3) 在程序创建qml资源时设置全局访问对象"testModel", 示例的字符串首字母只能下或线或者是小写。

3. 数据的交互(修改与访问)

(1) 它们的数据交互通过Q_PROPERTY宏定义实现

代码语言:javascript
复制
Q_PROPERTY(QString text READ text WRITE setText NOTIFY statusChanged)

(2) 当qml访问数据(调用testModel.text)时,Qt端则会调用text函数返回一个值。这里测试程序是:

代码语言:javascript
复制
QString text() { return "test"; }

(3) 当需要修改数据时候(调用testModel.text="123")时,Qt端则会调用setText设置相应的行为。这里测试程序是:

代码语言:javascript
复制
void setText(QString text) {
    m_text = text;
    emit statusChanged();
}

(4) 由于Q_PROPERTY宏定义类statusChanged信号,当用于发送statusChanged信号时,text()函数则会自动调用,从而刷新text的值(这里测试程序返回了固定值"123")。如果text函数返回的是m_text,这是setText设置的值。

代码语言:javascript
复制
QString text() { return m_text; }

4. 两种方法的区别

(1) 方法1需要创建实例才能使用,而方法2则是只有一个全局实例,在setContextProperty就已经创建了;

(2) 方法1学要在qml的import导入, 如下例(TestModel为注册的字符串,1.0为注册定义的版本号);

代码语言:javascript
复制
import TestModel 1.0

(3) 方法1生命周期在本页面,方法2生命周期是全局;

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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