使用Qml编程时,常常会与Qt之间进行数据访问或修改,本篇文章是介绍Qt与Qml的数据交互方法,一般有两种方法。
#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头文件
#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) 例:
qmlRegisterType<TestModel>("TestModel", 1, 0, "TestModel");
(2) qml中使用方法:
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) 例:
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("testModel", new TestModel());
(2) qml中使用方法:
<1> qml文件执行导入命令
import TestModel 1.0
<2> 使用
Column {
Text { text: "[2]" + testModel.text }
}
MouseArea {
anchors.fill: parent
onClicked: testModel.text = "123"
}
(3) 在程序创建qml资源时设置全局访问对象"testModel", 示例的字符串首字母只能下或线或者是小写。
3. 数据的交互(修改与访问)
(1) 它们的数据交互通过Q_PROPERTY宏定义实现
Q_PROPERTY(QString text READ text WRITE setText NOTIFY statusChanged)
(2) 当qml访问数据(调用testModel.text)时,Qt端则会调用text函数返回一个值。这里测试程序是:
QString text() { return "test"; }
(3) 当需要修改数据时候(调用testModel.text="123")时,Qt端则会调用setText设置相应的行为。这里测试程序是:
void setText(QString text) {
m_text = text;
emit statusChanged();
}
(4) 由于Q_PROPERTY宏定义类statusChanged信号,当用于发送statusChanged信号时,text()函数则会自动调用,从而刷新text的值(这里测试程序返回了固定值"123")。如果text函数返回的是m_text,这是setText设置的值。
QString text() { return m_text; }
4. 两种方法的区别
(1) 方法1需要创建实例才能使用,而方法2则是只有一个全局实例,在setContextProperty就已经创建了;
(2) 方法1学要在qml的import导入, 如下例(TestModel为注册的字符串,1.0为注册定义的版本号);
import TestModel 1.0
(3) 方法1生命周期在本页面,方法2生命周期是全局;
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有