【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++对象作为属性注册到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"
    }
}

运行结果:调用成功

在这里插入图片描述


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


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

守护进程“独辟蹊径”

守护进程“独辟蹊径” 一、前言二、实际运用2.1 知识介绍2.2 单机库场景应用2.2.1 配置dmwatcher.ini2.2.2 注册后台守护服务2.2.3 配置dmmal.ini2.2.4 配置归档和守护OGUID2.2.5 开启mal2.2.6 启动守护2.2.7 测试dmserver异常退出 三、总结 DM技术交流QQ群&#xff1a;9401242…

数据结构—环形缓冲区

写在前面&#xff0c;2023年11月开始进入岗位&#xff0c;工作岗位是嵌入式软件工程师。2024年是上班的第一年的&#xff0c;希望今年收获满满&#xff0c;增长见闻。 数据结构—环形缓冲区 为什么要使用环形数组&#xff0c;环形数组比起原来的常规数组的优势是什么&#xf…

Windows 10系统用Xlight FTP搭建SFTP服务器

步骤&#xff1a; 1.安装SFTP服务器 刚开始我使用的是freeSSHd&#xff0c;后面发现由于公司网络原因&#xff0c;打不开这个软件&#xff0c;改成了使用Xlight FTP&#xff0c; 官网下载链接&#xff1a;Xlight FTP 服务器 - 下载免费的windows FTP 服务器 Xlight FTP有30…

LocalSend 开源跨平台的局域网文件互传工具

如果您需要在多平台设备之间进行文件传输&#xff0c;例如从Windows电脑到安卓手机&#xff0c;或者从安卓手机到macOS&#xff0c;通常会使用聊天工具或者U盘进行传输。为了简化这一过程&#xff0c;推荐使用一款全平台支持的文件共享传输工具&#xff1a;LocalSend。 LocalS…

Qt通过pos()获取坐标信息

背景&#xff1a;这是一个QWidget窗体&#xff0c;里面是各种布局的组合&#xff0c;一层套一层。 我希望得到绿色部分的坐标信息(x,y) QPoint get_pos(QWidget* w, QWidget* parent) {if ((QWidget*)w->parent() parent) {return w->pos();}else {QPoint pos(w->po…

以 Serverfull 方式运行无服务器服务

当前 IT 架构中最流行的用例是从 Serverfull 转向 Serverless 设计。在某些情况下&#xff0c;我们可能需要以 Serverfull 方式设计服务或迁移到 Serverfull 作为运营成本的一部分。 在本文中&#xff0c;我们将展示如何将 Kumologica flow 作为 Docker 容器运行。通常&#x…

alibabaCloud学习笔记01(小滴课堂)

微服务架构常见的核心组件 讲解业务微服务架构常见解决方案 讲解AlibabaCloud核心组件介绍 创建数据库。 建表&#xff1a; 添加数据&#xff1a; 再建个用户库&#xff1a; 建表&#xff1a; 插入数据&#xff1a; 创建订单库&#xff1a; 建表&#xff1a; 创建项目&#x…

基于SpringBoot的旅游网站

目录 前言 开发环境以及工具 项目功能介绍 用户端&#xff1a; 管理端&#xff1a; 详细设计 用户端首页 登录页面 管理端页面 源码获取 前言 本项目是一个基于IDEA和Java语言开发基于SpringBoot的旅游网站。应用包含管理端和用户端等多个功能模块。 改革开放以来&am…

redis 三主六从高可用dockerswarm高级版(不固定ip)

redis集群(cluster)笔记 redis 三主三从高可用集群docker swarm redis 三主六从高可用docker(不固定ip) redis 三主六从高可用dockerswarm高级版(不固定ip) 此博客解决&#xff0c;redis加入集群后&#xff0c;是用于停掉后重启&#xff0c;将nodes.conf中的旧的Ip替换为新的…

【机器学习】卷积神经网络(五)-计算机视觉应用

七、应用-计算机视觉 7.1 人脸检测 DenseBox\Femaleness-Net\MT-CNN\Cascade CNN 介绍 VJ框架的分类器级联用于卷积网络 用于人脸检测的紧凑卷积神经网络级联 问题&#xff1a;作者希望实时检测高分辨率视频流中的正面&#xff0c;由于人脸图像和背景的多样性和复杂性&#xff…

Godot4.2——爬虫小游戏简单制作

目录 一、项目 二、项目功能 怪物 人物 快捷键 分数 游戏说明 提示信息 三、学习视频 UI制作 游戏教程 四、总结 一、项目 视频演示&#xff1a;Godot4爬虫小游戏简单制作_哔哩哔哩bilibili 游戏教程&#xff1a;【小猫godot4入门教程 C#版 已完结】官方入门案例 第…

【人工智能】百度智能云千帆AppBuilder,快速构建您的专属AI原生应用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》&#xff0c;此序列是《人工智能》专栏文章。 这是2024年第5篇文章&#xff0c;此篇文章是进行人工智能相关的实践序列文章&#xff0c;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&…

ResNet论文阅读和简单实现

论文&#xff1a;https://arxiv.org/pdf/1512.03385.pdf Deep Residual Learning for Image Recognition 本模块主要是阅读论文&#xff0c;会做简单的翻译&#xff08;至少满足我自己能看明白&#xff09;。 Introduction 由上图可见&#xff0c;在20层和56层的网络上训练的…

Linux的chmod命令及快捷写法

通过chmod命令可以修改文件、文件夹的权限信息 只有文件、文件夹的所属用户或root用户可以修改 形式&#xff1a;chmod [-R] 权限 文件或文件夹 -R&#xff1a;对文件夹内的全部内容应用同样的操作 eg&#xff1a;chmod urwx,grx,ox test.txt &#xff0c;将文件权限修改为…

python实现巴特沃斯低通滤波器——数字图像处理

原理&#xff1a; 巴特沃斯低通滤波器&#xff08;Butterworth Low-Pass Filter&#xff09;是图像处理中常用的一种频率域滤波器&#xff0c;它相较于理想低通滤波器提供了更平滑的过渡&#xff0c;以减少图像处理时引入的振铃效应。 设计原理&#xff1a; 巴特沃斯低通滤波…

隐藏层节点数对分类准确率的影响

直线上有9个格子&#xff0c;4个石子&#xff0c; 数量 结构编号 6 0 1 1 1 1 0 0 0 0 0 5 2 1 1 1 0 1 0 0 0 0 5 1 1 0 1 1 1 0 0 0 0 4 3 1 1 0 0 1 1 0 0 0 4 4 1 0 1 0 1 1 0 0 0 3 5 1 0 1 0 1 0 1 0…

Vue中的选项式 API 和组合式 API,两者有什么区别

Vue中的选项式 API&#xff08;Option API&#xff09;和组合式 API&#xff08;Composition API&#xff09;是两种不同的组件编写方式&#xff0c;它们各有特点和适用场景&#xff1a; 选项式 API&#xff08;Option API&#xff09;: 传统方法&#xff1a;Vue最初的编程范式…

c# OpenCvSharp Cv2.Threshold()和Cv2.AdaptiveThreshold参数说明

一、 Cv2.Threshold()二值化的函数参数说明 Cv2.Threshold()是一个用于图像二值化的函数。具体来说&#xff0c;它会将图像中的每一个像素的灰度值与一个阈值进行比较&#xff0c;大于该阈值的像素会被赋值为最大灰度值(即 255)&#xff0c;小于该阈值的像素会被赋值为最小灰度…

Python 自学(四) 之元组字典与集合

目录 1. 列表&#xff0c;元组&#xff0c;字典与集合的区别 2. 元组的创建和删除 tuple() del P101 3. 单个元素的元组 P102 4. 元组元素的修改 P106 5. 元组的使用场景 6. 字典的创建和删除 dict() zip() : del clear() P1…

SWM341系列之86盒智能开关应用

SWM341系列 86盒智能开关应用 华芯微特SWM341系列的SWM34SRET6&#xff0c;在86盒智能开关产品中的应用。 SWM34SRET6性能和UI的描述 SWM34SRET6是一款基于ARM Cortex-M33内核&#xff0c;最高主频可达150MHz时钟&#xff0c;提供内置512KB Flash&#xff0c;64KB SRAM&#…