前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >QML知识-与Qt数据交互

QML知识-与Qt数据交互

作者头像
Qt君
发布于 2019-07-16 06:12:29
发布于 2019-07-16 06:12:29
2.1K00
代码可运行
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程
运行总次数:0
代码可运行

使用Qml编程时,常常会与Qt之间进行数据访问或修改,本篇文章是介绍Qt与Qml的数据交互方法,一般有两种方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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头文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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) 例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qmlRegisterType<TestModel>("TestModel", 1, 0, "TestModel");

(2) qml中使用方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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) 例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("testModel", new TestModel());

(2) qml中使用方法:

<1> qml文件执行导入命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import TestModel 1.0

<2> 使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Column {
    Text { text: "[2]" + testModel.text }
}

MouseArea {
    anchors.fill: parent
    onClicked: testModel.text = "123"
}

(3) 在程序创建qml资源时设置全局访问对象"testModel", 示例的字符串首字母只能下或线或者是小写。

3. 数据的交互(修改与访问)

(1) 它们的数据交互通过Q_PROPERTY宏定义实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Q_PROPERTY(QString text READ text WRITE setText NOTIFY statusChanged)

(2) 当qml访问数据(调用testModel.text)时,Qt端则会调用text函数返回一个值。这里测试程序是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QString text() { return "test"; }

(3) 当需要修改数据时候(调用testModel.text="123")时,Qt端则会调用setText设置相应的行为。这里测试程序是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void setText(QString text) {
    m_text = text;
    emit statusChanged();
}

(4) 由于Q_PROPERTY宏定义类statusChanged信号,当用于发送statusChanged信号时,text()函数则会自动调用,从而刷新text的值(这里测试程序返回了固定值"123")。如果text函数返回的是m_text,这是setText设置的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QString text() { return m_text; }

4. 两种方法的区别

(1) 方法1需要创建实例才能使用,而方法2则是只有一个全局实例,在setContextProperty就已经创建了;

(2) 方法1学要在qml的import导入, 如下例(TestModel为注册的字符串,1.0为注册定义的版本号);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import TestModel 1.0

(3) 方法1生命周期在本页面,方法2生命周期是全局;

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【QML与C++混合编程】用QVariantList传递数组类型成员
更新:Record类要用指针,QObject 不能有拷贝函数。 我有一个C++中自定义的ReaderModel,继承自QAbstractListModel类,传递给了QML。 它的me成员是一个Reader指针,Reader有个成员是RecordModel。 通过reader获取的recordModel,在qml中类型是QVariant(RecordModel),我没法把它作为一个ListView的model。 要怎么让它绑定给view呢? 我尝试者把数据拷贝到一个直接传给qml的recordModel,但是当数据之后发生了变化时,视图就不会更新,除非再次拷贝,这样效率不可观。
饶文津
2020/06/02
4K0
【C++】Qt:QML介绍与入门示例
Qt Quick是一个用于构建现代、高效、可扩展用户界面的框架。它是Qt开发框架的一部分,旨在通过声明性语法和JavaScript绑定来简化用户界面的设计和实现。
DevFrank
2024/07/24
6970
【C++】Qt:QML介绍与入门示例
qml入门教程_前端从入门到放弃
<9>:Property and number animation in mouse event:
全栈程序员站长
2022/09/19
1.9K0
qml入门教程_前端从入门到放弃
QT之Qml使用QSystemTrayIcon实现系统托盘
 QT中实现这一功能使用QSystemTrayIcon,它为应用程序在系统托盘中提供一个图标。现代操作系统通常在桌面上提供一个特殊区域,称为系统托盘或通知区域,长时间运行的应用程序可以在其中显示图标和短消息。
杨永贞
2022/05/11
2.8K0
QT之Qml使用QSystemTrayIcon实现系统托盘
Qt5实战第十一篇:QML与Qt Quick详解
QML(Qt Meta-Object Language 或 Qt Modelling Language)和Qt Quick是Qt框架的重要组成部分,主要用于构建高性能、交互性强的用户界面。QML是一种基于JavaScript的声明性语言,而Qt Quick则是QML类型和功能的标准库。下面将详细讲解QML与Qt Quick的基本概念、特点、应用场景以及示例。
china马斯克
2025/01/04
4250
【QML】QML与C++混合编程
QML与C++混合编程 使用QQuickView pro文件中添加quick模块 #include<QApplication> #include<QQuickView> int main(int argc,char* argv[]){ QApplication app(argc,argv); //加载qml文件到视图 QQuickView view; view.setSource(QUrl("column.qml")); view.show(); re
半生瓜的blog
2023/05/13
9300
Qt Quick QML MouseArea 事件穿透
MouseArea 是 QML 中一个不可见的鼠标操作区域,可响应所有鼠标事件。一般情况下在自定义按钮、自定义需要鼠标交互的区域时使用。有时你只需要它的 hover 通知来做一些事情,而另外的点击等操作需要传递给其下层的控件,这时你就需要忽略其自身的鼠标按下释放等操作让其消息传递到下层了。
我与梦想有个约会
2023/10/21
1.1K0
QML动态显示组件(支持在线编辑动态刷新)
QML动态组件显示器主要用于方便界面开发,在线编辑保存后自动刷新组件界面,并支持拖拽文件显示的方式。
Qt君
2019/07/15
5.5K0
QtQuick 系列教程之 QML 与 C++ 交互
QML 作为一种灵活高效的界面开发语言已经越来越得到业界的认可。QML 负责界面,C++ 负责逻辑,这也是 Qt 官方推荐的开发方式。那么 QML 与 C++ 的交互必然是需要我们掌握并且精通的。
CSDN技术头条
2018/07/30
4.7K0
QtQuick 系列教程之 QML 与 C++ 交互
pyqt5与QML开发小结
qt 5.11 与 qt 5.12 中Qquick的差异还是蛮大的,由开发环境:Pyqt5.11 + Qt5.12 部署到 Pyqt5.11 + Qt5.11时遇到以下问题:
py3study
2020/01/17
1.5K0
Qt6 QML 中渲染自定义视频帧的改进 2023-05-30 更新
最近在升级音视频的项目 Qt 版本,从 5.15.0 升级到 6.4.3(6.5 也一样),除了一些 QML 中删除了一些 Qt Quick Controls 1 的控件以外,最重要的就是自定义视频渲染的改进。
我与梦想有个约会
2023/10/21
1.3K2
Qt QML VideoOutput 显示自定义的 YUV420P 数据流
在一些传统应用中,如果想使用 Qt 在 QWidget 或者 QML 中显示自定义的视频数据流,需要引入 OpenGL 来实现。而实际 Qt 已经准备了 VideoOutput 类型可以很方便的调用系统摄像头和使用自定义数据流。在 Qt 官网中,VideoOutput 的介绍中说明,source 属性可以是一个自定义派生于 QObject 的子类,并提供一个类型为 QMediaObject 的属性命名为 mediaObject,或者是一个派生与 QObject 的子类并提供一个类型为 QAbstractVideoSurface 的属性命名为 videoSurface。其中任意一个方法都可以实现自定义视频数据流的播放,本文介绍第二种方法。
我与梦想有个约会
2020/01/04
5.5K0
Qt官方示例-QML标签页
❝TabWidget示例演示了如何使用属性别名和QML Object默认属性创建标签页。❞ TabWidget.qml Item { id: tabWidget // 核心实现 // 将默认属性设置为stack.children意味着TabWidget的所有子项实际上都已添加到"stack"项的子项中。 // 有关默认属性的详细信息,请参见"Property Binding"文档。 default property alias content: stack.c
Qt君
2023/03/17
1.3K0
Qt官方示例-QML标签页
QML入门教程:一、QML和QtQuick简介以及QML实例
从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。在 Qt 5 中, QML 有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言。也就是说,使用 Qt 5,我们不仅可以使用 C++ 开发 Qt 程序,而且可以使用 QML。虽然 QML 是解释型语言,性能要比 C++ 低一些,但是新版 QML 使用 V8,Qt 5.2 又引入了专为 QML 优化的 V4 引擎,使得其性能不再有明显降低。在 Nokia 发布 Qt 4.7 的时候,QML 被用于开发手机应用程序,全面支持触摸操作、流畅的动画效果等。但是在 Qt 5 中,QML 已经不仅限于开发手机应用,也可以用户开发传统的桌面程序。 QML 文档描述了一个对象树。QML 元素包含了其构造块、图形元素(矩形、图片等)和行为(例如动画、切换等)。这些 QML 元素按照一定的嵌套关系构成复杂的组件,供用户交互。 ——摘自《Qt学习之路2》
全栈程序员站长
2022/11/01
4.6K0
QML入门教程:一、QML和QtQuick简介以及QML实例
QML文件读写控件(预览版)
File组件通过source的属性来设置需要读写的文件,还可以通过访问/设置text的内容来读取/写入文件。
Qt君
2019/12/25
7060
Qt Quick实践系列-Qml与Widget交互
  QQuickWidget底层继承的是QWidget,但它可以加载Qml文件(组件),但我们有时候需要和Qml文件(组件)数据交互使用,本文介绍几种QQuickWidget与Qml交互数据的方法。
Qt君
2020/03/19
4.7K0
Qt Quick实践系列-多语言切换
  上面一顿操作猛如虎,一看效果二百五。怎么没反应的,没变化呀。似乎有细心的人发现了一些奇怪的地方就是:
Qt君
2023/03/17
2.2K0
Qt Quick实践系列-多语言切换
完全依赖QML实现播放器
一直听闻QML无比强大好用,工作中需要扣一个同时播放视频的Demo,所以就趁这个机会研究了一下。
gongluck
2020/03/05
2.3K0
完全依赖QML实现播放器
【专业技术】还有人在用Qt开发app嘛?
编者按: 这个世界不缺工程师,但是缺大师。如果在Qt里写个app,传统做法,需要熟悉API,熟悉C++,熟悉Qt本身的实现,同时还要熟悉编程环境。 现在出现了一种类似于脚本Javascript的语言,利用它,我们可以少编写一些程序逻辑。可不,最近我就利用它开发出了个浏览器。大家都没有。 欢迎来到声明式UI语言QML的世界.在本入门教程中,我们使用QML创建一个简单的文本编辑器.阅读这个教程后,就可以使用QML和Qt C++开发应用程序了. 安装 首先需要安装包含Qt Quick的Qt最新版本,现在是Qt4.
程序员互动联盟
2018/03/14
4.8K0
【专业技术】还有人在用Qt开发app嘛?
qml 结合 QSqlTableModel 动态加载数据 MVC「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127739.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/25
1.1K0
qml 结合 QSqlTableModel 动态加载数据 MVC「建议收藏」
相关推荐
【QML与C++混合编程】用QVariantList传递数组类型成员
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验