【QML】与 C++ 混合编程:互相调用函数

文章目录

  • qml 调用 C++ 函数
    • 案例 a:Q_INVOKABLE 标记 C++ 函数 + 视图设置进 qml 属性
    • 案例 b:qml 通过发送信号的方式,调用 Qt 槽函数
  • C++调用qml函数


qml 调用 C++ 函数

qml 要使用 C++ 的函数有两个方法:
一种是,用 Q_INVOKABLE 标记该函数,
另一种是,该函数为 Qt 槽函数


案例 a:Q_INVOKABLE 标记 C++ 函数 + 视图设置进 qml 属性

案例 a 使用 视图(QQuickView),实现了 qml 调用 C++ 代码。

原理是,用视图调用接口,设置上下文属性 view.rootContext()->setContextProperty(/*xxx*/),将 C++ 的一个自定义类注册为 qml 属性。

🐎:main.cpp

#include <QApplication>
#include <QQuickView>
#include "applicationdata.h"
#include <QQmlContext>int main(int argc, char* argv[])
{QApplication app(argc, argv);// 定义一个视图对象QQuickView view;ApplicationData data;// 将C++对象作为属性注册到qmlview.rootContext()->setContextProperty("ApplicationData", &data);view.setSource(QUrl("../item.qml"));view.show();return app.exec();
}

🐎:applicationdata.h

#ifndef APPLICATIONDATA_H
#define APPLICATIONDATA_H#include <QObject>
#include <QDateTime>class ApplicationData : public QObject
{Q_OBJECT
public:explicit ApplicationData(QObject *parent = nullptr){}Q_INVOKABLE QDateTime getCurrentDateTime() const{return QDateTime::currentDateTime();}
signals:
};
#endif // APPLICATIONDATA_H

🐎:item.qml

import QtQuick 2.15
Text {text: ApplicationData.getCurrentDateTime()
}

运行结果:调用成功啦
在这里插入图片描述


案例 b:qml 通过发送信号的方式,调用 Qt 槽函数

qml 设置信号的语法:

  • signal SignalName(参数类型 参数名)

本案例在 onClicked 中调用槽函数,调用语法为:

  • 信号所在对象的id.SignalName

🐎:myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H#include <QObject>
#include <QDebug>class MyClass : public QObject
{Q_OBJECT
public:explicit MyClass(QObject *parent = nullptr){}public slots:void slotPrint(QString msg){qDebug() << msg;}
signals:
};#endif // MYCLASS_H

🐎:main.cpp

#include <QApplication>
#include <QQuickView>
#include <QQuickItem>
#include "myclass.h"/** C++使用槽函数* 接收信号:设置一个类对信号进行收到反馈的槽函数* 发送信号:qml对象
*/int main(int argc, char* argv[])
{QApplication app(argc, argv);// 视图绑定的另一种写法QQuickView view(QUrl::fromLocalFile("../QML_signal/item.qml"));// 创建对象,用来标记发送信号方QObject* item = view.rootObject();// 创建信号槽的对象MyClass myClass;QObject::connect(item,SIGNAL(qmlSignal(QString)),&myClass,SLOT(slotPrint(QString)));view.show();return app.exec();
}

🐎:item.qml

import QtQuick 2.15
Item {id: item; width: 200; height: 200signal qmlSignal(string msg)MouseArea{anchors.fill: parentonClicked: item.qmlSignal("你点了我一下");}
}

运行结果:调用成功
在这里插入图片描述


C++调用qml函数

本案例使用 引擎(QQmlApplicationEngine):实现了C++调用qml的函数。

原理是,通过元对象的 invokeMethod 接口,调用需要的函数,其中要注意的是invokeMethod 的参数列表和返回值必须指定类型为 Qvariant

🐎:main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>int main(int argc, char* argv[])
{QApplication app(argc, argv);// 创建引擎QQmlApplicationEngine engine;// 添加组件到引擎中QQmlComponent comp(&engine, "../item.qml");// 用组件创建对象QObject* obj = comp.create();QVariant msg = "hello qml and c++";	// 传给obj中qmlFunc函数的参数QVariant returnedValue;				// 接收返回值// invokeMethod 的参数列表和返回值必须指定类型为 QvariantQMetaObject::invokeMethod(obj,"qmlFunc",Q_RETURN_ARG(QVariant, returnedValue),		// 返回值Q_ARG(QVariant, msg));						// 参数// 打印返回值验证结果qDebug() << "QML function returned: " << returnedValue.toString();return app.exec();
}

🐎:item.qml

import QtQuick 2.15
Text {function qmlFunc(msg){console.log("this is a message: ", msg)return "aoao"}
}

运行结果:调用成功

在这里插入图片描述


🥰如果本文对你有些帮助,欢迎👉 点赞 收藏 关注,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 若有差错恳请留言指正~~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/230202.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 学习(三)OLED 调试工具

目录 一、简介 二、使用方法 2.1 接线图 2.2 配置引脚 2.3 编写代码 三、Keil 工具调试 一、简介 在进行单片机开发时&#xff0c;有很多调试方法&#xff0c;如下图&#xff1a; 其中 OLED 就是一种比较好用的调试工具&#xff1a; OLED 硬件电路如下&#xff0c…

7步教你如何快速建立电子商务网站

如果您需要以客户为中心搭建电子商务网站&#xff0c;或者您正在寻求开展电子商务业务&#xff0c;那么您很幸运——现在是开始的最佳时机&#xff01;事实上&#xff0c;在疫情期间&#xff0c;电子商务销售额增长了 50%。电子商务现在是一个价值 8700 亿美元的产业。随着如此…

深入了解Apache 日志,Apache 日志分析工具

Apache Web 服务器在企业中广泛用于托管其网站和 Web 应用程序&#xff0c;Apache 服务器生成的原始日志提供有关 Apache 服务器托管的网站如何处理用户请求以及访问您的网站时经常遇到的错误的重要信息。 什么是 Apache 日志 Apache 日志包含 Apache Web 服务器处理的所有事…

rime中州韵小狼毫 inputShow lua Filter 输入字符透传滤镜

在 rime中州韵小狼毫 inputShow lua Translator 一文中&#xff0c;我们通过 inputShow.lua 定制了 inputShow_translator&#xff0c;这使得我们的输入方案可以将用户输入的字符透传到候选列表中来。如下&#x1f447;&#xff1a; &#x1f446;上图中我们在候选列表中看到了…

音视频通信

文章目录 一、音视频通信流程二、流媒体协议1、RTSP2、RTMP3、HLS4、WebRTC 一、音视频通信流程 音视频通信完整流程有如下几个环节&#xff1a;采集、编码、前后处理、传输、解码、缓冲、渲染等。 每一个细分环节&#xff0c;还有更细分的技术模块。比如&#xff0c;前后处…

[足式机器人]Part2 Dr. CAN学习笔记-Ch01自动控制原理

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Ch01自动控制原理 1. 开环系统与闭环系统Open/Closed Loop System1.1 EG1: 烧水与控温水壶1.2 EG2: 蓄水与最终水位1.3 闭环控制系统 2. 稳定性分析Stability2.1 序言2.2 稳定的分类2.3 稳定的对…

[蓝桥杯2020国赛]答疑

答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下&#xff1a; 首先进入办公室&#xff0c;编号为 i 的同学需要 si​ 毫秒的时间。然后同学问…

2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…

Java数据结构:1. 数据结构前置知识

文章目录 一、初识数据结构二、初识集合框架1. 什么是集合框架2. 集合框架的重要性3. 背后所涉及的数据结构以及算法 三、时间复杂度空间复杂度1. 算法效率2. 时间复杂度&#xff08;1&#xff09;概念&#xff08;2&#xff09;大O的渐进表示法&#xff08;3&#xff09;推导大…

捕捉“五彩斑斓的黑”:锗基短波红外相机的多种成像应用

红外处于人眼可观察范围以外&#xff0c;为我们了解未知领域提供了新的途径。红外又可以根据波段范围&#xff0c;分为短波红外、中波红外与长波红外。较短的SWIR波长——大约900nm-1700nm——与可见光范围内的光子表现相似。虽然在SWIR中目标的光谱含量不同&#xff0c;但所产…

PostgreSQL荣获DB-Engines 2023年度数据库

数据库流行度排名网站 DB-Engines 2024 年 1 月 2 日发布文章宣称&#xff0c;PostgreSQL 荣获 2023 年度数据库管理系统称号。 PostgreSQL 在过去一年中获得了比其他 417 个产品更多的流行度增长&#xff0c;因此获得了 2023 年度 DBMS。 DB-Engines 通过计算每种数据库 2024 …

Amazon CodeWhisperer 免费 AI 代码生成助手体验分享

今年上半年&#xff0c;亚马逊云科技正式推出了实时AI编程助手 Amazon CodeWhisperer&#xff0c;还提供了供所有开发人员免费使用的个人版版本。经过一段时间的体验&#xff0c;我觉得 CodeWhisperer 可以处理编程工作中遇到的很多问题&#xff0c;并且帮助开发人员提高编程效…

高德地图经纬度坐标导出工具

https://tool.xuexiareas.com/map/amap 可以导出单个点&#xff0c;也可以导出多个&#xff0c;多个点可以连成线&#xff0c;可用于前端开发时自己模拟“线“数据

【Apache Doris】自定义函数之 JAVA UDF 详解

【Apache Doris】自定义函数之 JAVA UDF 详解 一、背景说明二、原理简介三、环境信息3.1 硬件信息3.2 软件信息 四、IDE准备五、JAVA UDF开发流程5.1 源码准备5.1.1 pom.xml5.1.2 JAVA代码 5.2 mvn打包5.2.1 clean5.2.2 package 5.3 函数使用5.3.1 upload5.3.2 使用 六、注意事…

华为端口隔离高级用法经典案例

最终效果&#xff1a; pc4不能ping通pc5&#xff0c;pc5能ping通pc4 pc1不能和pc2、pc3通&#xff0c;但pc2和pc3能互通 vlan batch 2 interface Vlanif1 ip address 10.0.0.254 255.255.255.0 interface Vlanif2 ip address 192.168.2.1 255.255.255.0 interface MEth0/0/1 i…

服务器防护怎么做

随着网络攻击的日益猖獗&#xff0c;服务器安全已成为关注的焦点。如何有效防御各种网络威胁&#xff0c;确保数据安全与业务连续性&#xff0c;已成为一项迫切的需求。目前服务器所面临的主要威胁包括但不限于&#xff1a;DDoS攻击、SQL注入、跨站脚本攻击(XSS)、远程命令执行…

大模型笔记 【1】 大模型初探

以下是Andrej Karpathy一小时讲解chatgpt的笔记。 Andrej Karpathy做自动驾驶的人应该比较熟悉&#xff0c;他是李飞飞的学生。在openAI做了一年半的科学家之后&#xff0c;去了特斯拉。在Tesla AI day讲解tesla自动驾驶方案的就是他。 这里我的主要收获是两个 大模型是一个有…

七夕祭

title: 七夕祭 date: 2024-01-03 22:47:05 tags: 传送门 题目大意 解题思路 行的感兴趣的摊点或者列的感兴趣的摊点的数量能被行数或者列数整除&#xff0c;则能够实现要求。“均分”思想&#xff0c;设总感兴趣摊点数 T T T 和行数列数 n n n&#xff0c;当前感兴趣的摊点数…

三、HTML元素

一、HTML元素 HTML 文档由 HTML 元素定义。 *开始标签常被称为起始标签&#xff08;opening tag&#xff09;&#xff0c;结束标签常称为闭合标签&#xff08;closing tag&#xff09;。 二、HTML 元素语法 HTML 元素以开始标签起始。HTML 元素以结束标签终止。元素的内容是…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 首次运行DevEco Studio

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— DevEco Studio下载与安装 上一篇文章详细说明了Dev Eco Stdio的下载即安装过程&#xff0c;本回讲一下首次运行DevEco Studio的过程。 笔者电脑的操作系统是Windows 11。点击“开始菜单”&#xff0c;在弹…