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

news2025/1/18 11:53:34

文章目录

  • 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++对象作为属性注册到qml
    view.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: 200
    
    signal qmlSignal(string msg)

    MouseArea
    {
        anchors.fill: parent
        onClicked: 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 的参数列表和返回值必须指定类型为 Qvariant
    QMetaObject::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.coloradmin.cn/o/1357928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能_机器学习089_DBSCAN聚类案例_DBSCAN聚类算法效果展示_使用轮廓系数来评分DBSCAN效果---人工智能工作笔记0129

dbscan = DBSCAN(eps = 0.2,min_samples =3) 我们指定半径是0.2 然后每个圆圈至少是3个数据就可以归为一类 dbscan.fit(X) 然后进行训练 # 得到每个样本的标签,分类结果 y_ =dbscan.labels_ 然后得到结果 ,注意这里不需要进行predict,因为fit直接就相当于分类了 plt.scatte…

Linux_CentOS_7.9_MySQL_5.7配置数据库服务开机自启动之简易记录

前言&#xff1a; 作为运维保障&#xff0c;都无法准确预估硬件宕机的突发阶段&#xff0c;其生产数据实时在产出&#xff0c;那作为dba数据库服务的其重要性、必要性就突显而出。这里拿虚拟机试验做个配置记录&#xff0c;便于大家学习参考。 # 如出现服务器重启后登入报错无…

iPaaS与ETL:了解它们的主要区别

平均每个组织使用 130 多个应用程序&#xff0c;这一数字同比增长 30%。 随着公司试图充分利用其不断增长的应用程序生态系统&#xff0c;他们已经转向可以集成它们和/或其数据的工具。两个常用选项包括集成平台即服务 &#xff08;iPaaS&#xff09; 和提取、传输、加载 &…

商城小程序(5.商品列表)

目录 一、定义请求参数对象二、获取商品列表数据三、渲染商品列表结构四、把商品item封装为自定义组件五、使用过滤器处理价格六、上拉加载更多七、下拉刷新八、点击商品item项跳转到详情页面 这章主要完成商品列表页面的编写&#xff1a;位于subpkg分包下的goods_list页面 一…

基于ssm的网上购物平台设计+jsp论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

SpringMVC-视图

SpringMVC中的视图实现了View接口&#xff0c;作用是渲染数据&#xff0c;将Model中的数据展示给用户。render是渲染方法&#xff0c;可以看到渲染的视图是一个View类型的对象。 SpringMVC视图的种类有很多&#xff0c;默认有转发视图和重定向视图。 如果配置了Thymeleaf视图解…

Ansible的安装及简单使用

## Ansible的安装及简单使用 ## 一.Ubuntu安装Ansible sudo apt update sudo apt install ansible #使用以下命令检查安装是否成功&#xff1a; ansible --version二.配置Ansible #进入配置文件目录 cd /etc/ansible/ ls#文件含义 ansible.cfg #ansible配置文件,默认基本不用…

安卓和Android是两种不同的操作系统?

实际上&#xff0c;安卓和Android并不是同一种操作系统&#xff01; Android是由Google开发并维护更新的一款操作系统&#xff0c;目前仅能运行在Pixel手机上。 Google Pixel 与 iPhone手机&#xff1a;哪个更好&#xff1f;Google Pixel 与 Apple iPhone哪个手机才是性价比最…

JavaScript IE浏览器展示pdf

工具 语法 <div style"height: 95%;width: 1000px;text-align: center;margin: 5px auto;"><div id"pdf_div" style"width: 100%;height: 100%;"></div></div>var divHtml "<object classidclsid:CA8A9780-280…

基于ssm的教室信息管理系统论文

摘 要 使用旧方法对教室信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在教室信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的教室信息管理系统有管理…

Electron介绍

前言 相信很多的前端小伙伴都想过一个问题&#xff0c;web技术是否可以用于开发桌面应用。答案当然是可以的&#xff0c;Electron框架就是其中的一种解决方案。 Electron介绍 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 并不是一门新的…

眼镜清洗机有哪些品牌值得入手?眼镜清洗机性价比高推荐

在这个科技飞速发展的时代&#xff0c;我们的生活品质不断提高&#xff0c;各种便捷的智能家居用品如雨后春笋般涌现。眼镜清洗机作为近年来备受瞩目的家居小电器&#xff0c;以其高效、便捷的特性赢得了广大消费者的青睐。但市场上眼镜清洗机品牌众多&#xff0c;如何选择一款…

Vue中使用Element UI的Table组件实现嵌套表格(最简单示例)

以下是一个简单的示例代码&#xff0c;演示如何在Vue中使用Element UI的Table组件实现嵌套表格&#xff1a; html <template><div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label&quo…

Capsolver:解决Web爬虫中CAPTCHA挑战的最优解决方案

Web爬虫已经成为从各种在线来源提取和分析数据的不可或缺的技术。然而&#xff0c;在Web爬取过程中&#xff0c;经常会遇到的一个共同挑战是CAPTCHA。CAPTCHA&#xff08;完全自动化的公共图灵测试&#xff0c;用于区分计算机和人类&#xff09;是一种安全措施&#xff0c;旨在…

JavaWeb基础(2)- Web概述、HTTP协议、Servlet、Request与Response

JavaWeb基础&#xff08;2&#xff09;- Web概述、HTTP协议、Servlet、Request与Response 文章目录 JavaWeb基础&#xff08;2&#xff09;- Web概述、HTTP协议、Servlet、Request与Response3 Web概述3.1 Web和JavaWeb的概念3.2 JavaWeb技术栈3.2.1 B/S架构**3.2.2 静态资源**3…

SpringIOC之support模块DefaultMessageSourceResolvable

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

玻璃生产ERP有什么品牌?哪家的玻璃生产ERP操作简单

不同的玻璃制品有不同的生产工艺&#xff0c;而每道生产工序又有区别化的管理方式&#xff0c;涉及复杂的品质检验标准。同时部分玻璃制品的生产过程复杂&#xff0c;每张生产工单的工艺是否计件、是否品质的标准各不相同。 还有些玻璃生产企业内部存在排产混乱、订单追踪难、…

目标检测中的常见指标

概念引入&#xff1a; TP&#xff1a;True Positive IoU > 阈值 检测框数量 FP: False Positive IoU < 阈值 检测框数量 FN: False Negative 漏检框数量 Precision:查准率 Recall:查全率&#xff08;召回率&#xff09; AP&am…

如何利用PLC网关实现PLC远程调试?

在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;是核心组成部分。但传统PLC调试方式往往需要工程师亲临现场&#xff0c;这不仅耗时&#xff0c;还增加了成本。好消息是&#xff0c;借助PLC网关&#xff0c;我们可以实现PLC的远程调试&#xff01;今…

WEB 3D技术 three.js 法向量演示性讲解

本文 我们来说法向 法向 又叫 法向量 就是 我们一个三维物体 顶点垂直于面 的方向 向量 他的作用 用来做光反射 根据光照的方向 根据面进行反射 我们上文写的这个代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "…