【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.hqwc.cn/news/317588.html

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

相关文章

软件测试/测试开发丨Python 模块与包

python 模块与包 python 模块 项目目录结构 组成 package包module模块function方法 模块定义 定义 包含python定义和语句的文件.py文件作为脚本运行 导入模块 import 模块名from <模块名> import <方法 | 变量 | 类>from <模块名> import * 注意&a…

ECharts配置个性化图表:圆环、立体柱状图

官网调试地址&#xff1a;调试 效果图&#xff1a; 配置&#xff1a; option {color: [#29BEFF, #A2DC00, #FFC400, #FF7F5C, #CA99FC],// 提示窗tooltip: {trigger: item,show: false},// 图例legend: {top: 5%,left: center,show: false},// 数据series: [{name: Access …

从fuzz视角看CTF堆题--qwb2023_chatting

前言 这个题目是一个c的堆题&#xff0c;而我自己对于c的一些内存分配不太了解&#xff0c;同时也不太会c的逆向&#xff0c;硬看是没有办法了&#xff0c;所以就想能不能通过fuzz的角度去进行利用 fuzz 大概思路 函数选择 可以看到有add delete switch read listuser mes…

vue 实现拐弯时间线,弯曲时间线,弯曲任务步骤条

需求&#xff1a; 实现可拐弯的步骤条功能 实现后效果如下&#xff1a; 代码部分&#xff1a; 创建步骤条组件Steps.vue <template><div><divstyle"width: 100%; display: flex; position: relative; margin-top: 20px"><div style"wi…

leetcode12 整数转罗马数字

题目描述&#xff1a;给定一个整数&#xff0c;将其转换为罗马数字。罗马数字由七个字符表示&#xff1a;I&#xff08;1&#xff09;、V&#xff08;5&#xff09;、X&#xff08;10&#xff09;、L&#xff08;50&#xff09;、C&#xff08;100&#xff09;、D&#xff08;5…

【Matlab】基于遗传算法优化BP神经网络 (GA-BP)的数据时序预测(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88682033 目录 【Matlab】BP 神经网络时序预测算法 【Matlab】CNN卷积神经网络时序预测算法 【Matlab】ELM极限学习机时序预测算法 【Matlab】基于遗传算法优化BP神经网络 (GA-BP)的数据时序预测 【Mat…

搭建Python环境

为了能进行Python开发&#xff0c;需要搭建Python环境 搭建运行环境&#xff1a;Python 搭建开发环境&#xff1a;PyCharm 安装Python 1.点开python官网 欢迎来到 Python.orghttps://www.python.org/ 2.选择Downloads&#xff08;下载&#xff09; &#xff08;上面的…

2024年CIO的14大战略优先事项与关键趋势解析

GenAI将成为2024年的核心技术趋势&#xff0c;对CIO来说是主要关注点。他们需负责评估新工具&#xff0c;搭建基础设施&#xff0c;应对潜在风险&#xff0c;并且把握创新的用户体验机会。挑战在于&#xff0c;众多供应商争相推出价格不菲的GenAI功能。CIO需要通过商业案例分析…

MySQL基础篇(一)SQL

视频地址: 黑马程序员 MySQL数据库入门到精通&#xff0c;从mysql安装到mysql高级、mysql优化全囊括 SQL&#xff0c;全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一 标准。 一、SQL通用语…

【力扣题解】P700-二叉搜索树中的搜索-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P700-二叉搜索树中的搜索-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f…

Python 面向对象之绑定和非绑定方法

Python 面向对象之绑定和非绑定方法 【一】序言 在Python类的成员中分为两类&#xff1a;一个是属性&#xff0c;另一个就是方法&#xff08;就是定义的函数&#xff09;方法又分为两大类&#xff1a;绑定方法&#xff08;动态方法&#xff09;和非绑定方法&#xff08;静态方…

RocketMQ5.0消息过滤

前言 消费者订阅了某个主题后&#xff0c;RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息&#xff0c;可通过设置过滤条件在 Broker 端进行过滤&#xff0c;只获取到需要关注的消息子集&#xff0c;避免接收到大量无效的消息。 以电商交易场景为例…