QML知識-與Qt資料互動
使用Qml程式設計時,常常會與Qt之間進行資料訪問或修改,本篇文章是介紹Qt與Qml的資料互動方法,一般有兩種方法。
TestModel標頭檔案:
#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
main函式:
#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", 1, 0, "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(); }
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生命週期是全域性;