找回密码
 立即注册
Qt开源社区 门户 查看内容

QML知识-与Qt数据交互

2019-4-21 12:18| 发布者: admin| 查看: 704| 评论: 0

摘要: 使用Qml编程时,常常会与Qt之间进行数据访问或修改,本篇文章是介绍Qt与Qml的数据交互方法,一般有两种方法。#ifndefTESTMODEL_H#defineTESTMODEL_H#includeQObjectclassTestModel:publicQObject{Q_OBJECTQ_PROPERTY ...
    使用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", 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();
}

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


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:你才小学生,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了