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中使用方法:

扫描二维码关注公众号,回复: 4644107 查看本文章

    <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生命周期是全局;

猜你喜欢

转载自blog.csdn.net/nicai_xiaoqinxi/article/details/85080692
今日推荐