QML 怎么调用 C++ 中的内容?
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ
先说明一下测试环境
编译器:vs2017x64
开发环境:Qt5.12
这里主要是总结一下,怎么在 QML 文件中引用 C ++ 文件里定义的内容?
很简单,我们可以在 C ++ 文件中通过 QML 引擎(QQmlEngine class)的上下文对象(QQmlContext)调用方法 setContextProperty 设置对应的引用即可。详情看看下面的方法声明:
void QQmlContext::setContextProperty(const QString &name, QObject *value);
void QQmlContext::setContextProperty(const QString &name, const QVariant &value);
可以看到,既可以设置 QObject 类型的对象(指针),也可以设置 QVariant 兼容的类型数据(包括基本类型数据等)到 QML 引擎的上下文中。然后在 QML 中就可以通过引用名 name 直接调用即可。
1. 设置类型数据
// main.cpp
#include <QDateTime>
void main() {
//...
QQmlEngine engine;
QDateTime dateTime = QDateTime::currentDateTime();
engine.rootContext()->setContextProperty("dateTime", &dateTime);
//...
}
以上代码中直接将 QDateTime 类型的数据设置到引擎上下文中。
Rectangle {
id: window
//...
Text {
text: dateTime
}
}
通过引用名 dateTime 将 C ++ 文件中的数据绑定到组件 Text 的 text 属性上,进而显示出来。
2. 设置对象指针
上面是设置数据,这里设置的是 QObject 类型的指针,所以在 QML 里还可以调用 C ++ 文件中定义的对象,包括属性和方法等。
首先,定义一个 QObject 的派生类 ApplicationData,从 QObject 派生是必须的。
// applicationdata.h
#include <QObject>
#include <QDateTime>
#include <QTimer>
class ApplicationData : public QObject
{
Q_OBJECT
public:
ApplicationData(){
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &ApplicationData::slt_timeout);
timer->start(1000);
}
Q_INVOKABLE QDateTime getCurrentDateTime() const {
return m_currentDateTime;
}
signals:
void sig_dataTimeUpdated();
private slots:
void slt_timeout() {
m_currentDateTime = QDateTime::currentDateTime();
emit sig_dataTimeUpdated();
}
private:
QDateTime m_currentDateTime;
};
其中 Q_INVOKABLE 用于声明此方法可被元对象系统调用。这个类实现每 1000 ms 刷新内部日期时间属性,并且发射信号 sig_dataTimeUpdated,此属性值可以通过调用定义的公共方法 getCurrentDateTime() 得到。
下面再来定义程序入口文件:
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "applicationdata.h"
int main(int argc, char *argv[])
{
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
ApplicationData data;
engine.rootContext()->setContextProperty("currentDateTime", &data);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
在 QML 引擎装载 QML 文件前,先将类 ApplicationData 的对象指针设置到上下文中。
下面再看看怎么调用指针对应的类对象。
// main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.VirtualKeyboard 2.4
Window {
id: window
visible: true
title: qsTr("Hello World")
Text {
id: name_id
anchors.centerIn: parent
}
Connections {
target: currentDateTime
onSig_dataTimeUpdated: {
name_id.text = currentDateTime.getCurrentDateTime();
}
}
}
使用 Connections 连接数据对象 currentDateTime 的信号,当指针对象的信号 sig_dataTimeUpdated 发射出来时,调用方法 getCurrentDateTime() 并用结果设置组件 Text 的属性 text。
显示的效果是动态刷新时间日期数据的,这和在上下文中设置类型数据不同(不会刷新),如下图:

其实在我的另一篇博文《一文入门Qt Quick》中也有对这一块主题的说明,不妨去看看吧!
QML 怎么调用 C++ 中的内容?的更多相关文章
- 代码实现:定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)
package com.loaderman.test; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; im ...
- C语言:将字符串中的字符逆序输出,但不改变字符串中的内容。-在main函数中将多次调用fun函数,每调用一次,输出链表尾部结点中的数据,并释放该结点,使链表缩短。
//将字符串中的字符逆序输出,但不改变字符串中的内容. #include <stdio.h> /************found************/ void fun (char ...
- Tom_No_02 Servlet向流中打印内容,之后在调用finsihResponse,调用上是先发送了body,后发送Header的解释
上次在培训班学上网课的时候就发现了这个问题,一直没有解决,昨天又碰到了,2-3小时也未能发现点端倪,今早又仔细缕了下,让我看了他的秘密 1.Servlet向流中打印内容,之后在调用finsihResp ...
- 在指定的div中搜索内容,并滚动显示到当前搜索到的内容处
我想要的是页面中有个带滚动条的div对象,里面有很多内容,想要用js搜索到div中的某个字符串内容,然后将div的滚动条滚动到搜索到的内容处显示,自动定位.先是查找页面中的内容,然后将找到的内容创建t ...
- dedecms首页怎么调用公司简介的内容
DeDeCMS功能虽然强大,但还是有些细节上的功能没有实现,正如本文描述的问题一样,DEDECMS要在网站首页调用公司简介的内容,而且还要截取前多少个字符数的时候,DEDECMS标签中没有能实现这样的 ...
- 在VS2012中采用C++中调用DLL中的函数 (4)
这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...
- js打印Iframe中的内容,并且不需要预览。
js打印Iframe中的内容,并且不需要预览 js代码如下: <script type="text/javascript" language="Javascript ...
- (DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device
Linux kernel 是怎么将 devicetree中的内容生成plateform_device 1,实现场景(以Versatile Express V2M为例说明其过程)以arch/arm/ma ...
- phpcms v9使用GET调用指定id文章内容、页面数据方法
不知道大家有没有相同的体会?在使用Phpcms V9建站调用数据的时候,基础的数据用默认的模板的调用语句就好了,但复杂不常见的数据怎么调用呢?我们技术可能会研究半天,怀着探索的精神不断尝试.孜孜不倦. ...
随机推荐
- 论文解读(SEP)《Structural Entropy Guided Graph Hierarchical Pooling》
论文信息 论文标题:Structural Entropy Guided Graph Hierarchical Pooling论文作者:Junran Wu, Xueyuan Chen, Ke Xu, S ...
- Spring 08: AOP面向切面编程 + 手写AOP框架
核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...
- 我用Axure制作了一款火影小游戏 | PM老猫
Axure不仅仅是一个原型工具,除了原型之外还可以用来制作一些静态网页,这点对于不懂代码或前端的同学来说挺实用.之前整理了一版<Axure函数自查表>,因为感觉内容太多又对前端样式及脚本感 ...
- NOI 2019 省选模拟赛 T1【JZOJ6082】 染色问题(color) (多项式,数论优化)
题面 一根长为 n 的无色纸条,每个位置依次编号为 1,2,3,-,n ,m 次操作,第 i 次操作把纸条的一段区间 [l,r] (l <= r , l,r ∈ {1,2,3,-,n})涂成颜色 ...
- 【JAVA】学习路径35-InputStream使用例子
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; pu ...
- PHP代码审计——文件操作漏洞
梦想CMS(lmxcms)任意文件删除 1. 漏洞详情--CNVD-2020-59469 2. 漏洞描述称后台Ba***.cl***.php文件存在任意文件删除,查看cms源码,只有BackdbA ...
- KingbaseES函数如何返回结果集
函数返回值一般是某一类型值,如int,varchar,date等,返回结果集时就需要用到setof语法. 创建数据 create table class(id number primary key, ...
- Python数据科学手册-机器学习:朴素贝叶斯分类
朴素贝叶斯模型 朴素贝叶斯模型是一组非常简单快速的分类方法,通常适用于维度非常高的数据集.因为运行速度快,可调参数少.是一个快速粗糙的分类基本方案. naive Bayes classifiers 贝 ...
- Django 之必知必会三板斧
一.HttpResponse 在django.http 模块中定义了HttpResponse 对象的API,HttpRequest 对象由Django 自动创建,不调用模板,直接返回数据. 1 在 a ...
- MySQL集群搭建(2)-主主从模式
1 环境准备 上次我们搭建了主备架构,如下所示 这次我们的搭建目标是 具体配置信息 IP 系统 端口 MySQL版本 节点 读写 说明 192.168.41.83 Centos6.8 3306 5.7 ...