1. 程式人生 > >QML知識-與Qt資料互動

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生命週期是全域性;