qml与C++的交互

qml端使用C++对象类型、qml端调用C++函数/c++端调用qml端函数、qml端发信号-连接C++端槽函数、C++端发信号-连接qml端函数等。

在这里插入图片描述

代码资源下载:
https://download.csdn.net/download/TianYanRen111/88779433
若无法下载,直接拷贝以下代码测试即可。

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "MyObject.h"
#include "TestObject.h"int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);QQmlApplicationEngine engine;const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);qmlRegisterType<MyObject>("com.mycompany.qmlcomponents", 1, 0, "MyObject");qmlRegisterType<TestObject>("com.mycompany.qmlcomponents", 1, 0, "TestObject");engine.load(url);//auto objs = engine.rootObjects();auto window = objs.first();// c++ 绑定信号槽,C++端发信号// 此种形式必须将信号设置为 QVariant类型MyObject obj;QObject::connect(&obj, SIGNAL(sendCpp2(QVariant, QVariant)), window, SLOT(slotCpp(QVariant, QVariant)));obj.test2(); // 发送信号// c++端调用qml端函数qDebug()<<objs.first()->objectName();QVariant ret;QVariant arg1 = 123333;QVariant arg2 = "zhangsan===";QMetaObject::invokeMethod(window, "qmlFunc", Q_RETURN_ARG(QVariant, ret),Q_ARG(QVariant, arg1),Q_ARG(QVariant, arg2));return app.exec();
}

MyObject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H#include <QObject>
#include <QDebug>class MyObject : public QObject
{Q_OBJECTQ_PROPERTY(int num READ num WRITE setNum NOTIFY numChanged)Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)public:explicit MyObject(QObject *parent = nullptr);    int num() const;QString name() const;Q_INVOKABLE void printMessage();Q_INVOKABLE void test1() {emit sendCpp1("--------------111111-------");}void test2() {emit sendCpp2("---------2222222222------------series", 222222222222);}public slots:void setNum(int num);void setName(QString name);void onMsg(QString msg, int value);signals:void numChanged(int num);void nameChanged(QString name);void sendCpp1(QString message);void sendCpp2(QVariant message, QVariant value);private:int m_num;QString m_name;
};#endif // MYOBJECT_H

MyObject.cpp

#include "MyObject.h"MyObject::MyObject(QObject *parent) : QObject(parent)
{}int MyObject::num() const
{return m_num;
}QString MyObject::name() const
{return m_name;
}void MyObject::printMessage()
{qDebug() << "@@@@@@@@@@@@@@@ message is:> 11111111111";
}void MyObject::setNum(int num)
{if (m_num == num)return;m_num = num;emit numChanged(m_num);
}void MyObject::setName(QString name)
{if (m_name == name)return;m_name = name;emit nameChanged(m_name);
}void MyObject::onMsg(QString msg, int value)
{qDebug() << "################> msg:value is:> " << msg << value;
}

TestObject.h

#ifndef TESTOBJECT_H
#define TESTOBJECT_H#include <QObject>class TestObject : public QObject
{Q_OBJECTQ_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged)public:explicit TestObject(QObject *parent = nullptr);QString message() const {return m_message;}public slots:void setMessage(QString message) {{if (m_message == message)return;m_message = message;emit messageChanged(m_message);}}signals:void messageChanged(QString message);private:QString m_messsage;QString m_message;
};#endif // TESTOBJECT_H

main.qml

import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.3
import QtQml 2.12
import com.mycompany.qmlcomponents 1.0Window {id: windowobjectName: "myWindow"visible: truewidth: 600height: 250title: qsTr("Hello World")signal sendMsg(string msg, int value)function slotCpp(message, value) {console.log(">>>... " + message + " " + value)}function qmlFunc(msg, value) {console.log("......qml function... msg:value:> ", msg, value)}MyObject {id: myObjectnum: 101name: "zhangSan"onNumChanged: {console.log("...new num is:> ", num)}onNameChanged: {console.log("...new name is:> ", name)}Component.onCompleted: {console.log("...init num and name is:> " + num + " " + name)}}TestObject {id: testObjectmessage: "HelloWorld..."onMessageChanged: {console.log("...new message is:> ", message)}Component.onCompleted: {console.log("...init message is:>" + message)}}Column {spacing: 10Button {text: "qml中测试c++对象类型"onClicked: {myObject.num = 102myObject.name = "wang"testObject.message = "HelloWorld, I love you..."}}Button {text: "qml端调用C++端函数"onClicked: {myObject.printMessage()}}Button {text: "qml端发送信号, 连接C++端槽函数"onClicked: {sendMsg("...qml signal", 66666666)}}Button {text: "C++端发送信号, 连接qml端槽函数"onClicked: {myObject.test1()}}}// qml信号连接C++槽函数:方式一//    Connections {//        target: window//        onSendMsg: {//            myObject.onMsg("...qml signal", 8888888)//        }//    }//qml信号连接C++槽函数:方式二Component.onCompleted: {window.sendMsg.connect(myObject.onMsg)}Connections {target: myObjectonSendCpp1: {console.log("......======" + message)}}
}

请添加图片描述

参考文章
https://blog.csdn.net/wzz953200463/article/details/129504685

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

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

相关文章

mmpose 2d姿态预测值转json文件

目录 效果图: 参考 模板文件下载地址: python预测代码: 效果图: <

51单片机ESP8266

一、MQTT透传AT固件 安信可提供的烧录WiFi固件工具&#xff1a; 链接: https://docs.ai-thinker.com/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B72 安信可提供的固件库链接: https://docs.ai-thinker.com/%E5%9B%BA%E4%BB%B6%E6%B1%87%E6%80%BB 经过测试&#xff0c;选择这个不可以…

Zephyr 源码调试

背景 调试环境对于学习源码非常重要&#xff0c;但嵌入式系统的调试环境搭建稍微有点复杂&#xff0c;需要的条件略多。本文章介绍如何在 Zephyr 提供的 qemu 上调试 Zephyr 源码&#xff0c;为后续分析 Zephyr OS 相关原理做铺垫。 环境 我的开发环境为 wsl ubuntu&#xf…

Redis 击穿、穿透、雪崩产生原因解决思路

大家都知道&#xff0c;计算机的瓶颈之一就是IO&#xff0c;为了解决内存与磁盘速度不匹配的问题&#xff0c;产生了缓存&#xff0c;将一些热点数据放在内存中&#xff0c;随用随取&#xff0c;降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是&#xff0c;无论是击穿…

逻辑回归中的损失函数梯度下降

一、引言 逻辑回归中的损失函数通常采用的是交叉熵损失函数&#xff08;cross-entropy loss function&#xff09;。在逻辑回归中&#xff0c;我们通常使用sigmoid函数将线性模型的输出转换为概率值&#xff0c;然后将这些概率值与实际标签进行比较&#xff0c;从而计算损失。 …

模型选择实战

我们现在可以通过多项式拟合来探索这些概念。 import math import numpy as np import torch from torch import nn from d2l import torch as d2l生成数据集 给定x&#xff0c;我们将使用以下三阶多项式来生成训练和测试数据的标签&#xff1a; max_degree 20 # 多项式的最…

前端面试题-(浏览器内核,CSS选择器优先级,盒子模型,CSS硬件加速,CSS扩展)

前端面试题-(浏览器内核&#xff0c;CSS选择器优先级&#xff0c;盒子模型&#xff0c;CSS硬件加速&#xff0c;CSS扩展&#xff09; 常见的浏览器内核CSS选择器优先级盒子模型CSS硬件加速CSS扩展 常见的浏览器内核 内核描述Trident(IE内核)主要用在window系统中的IE浏览器中&…

分布式锁实现(mysql,以及redis)以及分布式的概念(续)redsync包使用

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物 这张尽量结合上一章进行使用&#xff1a;上一章 这章主要是讲如何通过redis实现分布式锁的 redis实现 这里我用redis去实现&#xff1a; 技术&#xff1a;golang&#xff0c;redis&#xff0c;数据结构 …

使用Python的pygame库实现自动追踪目标的Snake游戏

和上一期不同的目标追踪入门不同的是&#xff0c;这期是自动追踪科学游戏&#xff0c;话不多说&#xff0c;321上链接 一、项目背景 Snake游戏是一款经典的游戏&#xff0c;玩家需要控制一条蛇在屏幕上移动&#xff0c;吃掉食物并避免撞到自己的身体或墙壁。传统的Snake游戏通常…

校园跑腿小程序源码系统+代取快递+食堂超市代买+跑腿 带完整的安装代码包以及搭建教程

随着移动互联网的普及&#xff0c;人们越来越依赖于手机应用来解决日常生活中的各种问题。特别是在校园内&#xff0c;由于快递点距离宿舍较远、食堂排队人数过多等情况&#xff0c;学生对于便捷、高效的服务需求愈发强烈。在此背景下&#xff0c;校园跑腿小程序源码系统应运而…

蓝桥杯备赛 week 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…

Linux/Academy

Enumeration nmap 首先扫描目标端口对外开放情况 nmap -p- 10.10.10.215 -T4 发现对外开放了22,80,33060三个端口&#xff0c;端口详细信息如下 结果显示80端口运行着http&#xff0c;且给出了域名academy.htb&#xff0c;现将ip与域名写到/et/hosts中&#xff0c;然后从ht…

【12.PWM输出】蓝桥杯嵌入式一周拿奖速成系列

系列文章目录 蓝桥杯嵌入式系列文章目录(更多此系列文章可见) PWM输出 系列文章目录一、STM32CUBEMX配置二、项目代码1.main.c --> PWMOutputProcess 总结 一、STM32CUBEMX配置 STM32CUBEMX PA6 ->TIM16_CH1; PA7-> TIM17_CH1 预分频设置为79,自动重装载设置999PWM输…

PyQtGraph 之PlotCurveItem 详解

PyQtGraph 之PlotCurveItem 详解 PlotCurveItem 是 PyQtGraph 中用于显示曲线的图形项。以下是 PlotCurveItem 的主要参数和属性&#xff1a; 创建 PlotCurveItem 对象 import pyqtgraph as pg# 创建一个 PlotCurveItem curve pg.PlotCurveItem()常用的参数和属性 setData(…

资源管理核心考点梳理

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 PMP - 资源管理核心考点梳理 资源管理包括人力资源和实物资源管理。学习的重点是人力资源的管理&#xff0c;这一章是考试的重点章节&#xff0c;在新考纲中&#xff0c;“人”这一模块在题目种的比例是42%。 01 …

14.块参照的旋转(BlockReference)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET FrameWork4.5、ObjectArx 2016 64bit、Entity Framework 6. 在排水管网数据的编图时&#xff0c;时常会遇见针对雨水箅等进行旋转。由于数据存储在数据库内&#xff0c;通过CAD自带的旋转功能只能变更图面而无法…

SVG 矩形 – SVG Rectangle (3)

简介 rect 元素用于创建 SVG 矩形和矩形图形的变体。有六个属性决定矩形在屏幕上的形状和位置 x, y – 矩形左上角的 x, y 坐标width、height – 矩形的宽度和高度rx、ry – 矩形角的 x 和 y 半径 如果没有设置 x 和 y 属性&#xff0c;则矩形的左上角放置在点 (0,0) 处。 如…

Python 中的多进程(01/2):简介

一、说明 本文简要而简明地介绍了 Python 编程语言中的多处理&#xff08;多进程&#xff09;。解释多处理的基本信息&#xff0c;如什么是多处理&#xff1f;为什么用多处理&#xff1f;在python中怎么办等。 二、什么是多处理&#xff1f; 多处理是指系统同时支持多个处理器的…

C语言第八弹---一维数组

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 一维数组 1、数组的概念 2、⼀维数组的创建和初始化 2.1、数组创建 2.2、数组的初始化 2.3、数组的类型 3、⼀维数组的使用 3.1、数组下标 3.2、数组元素…

Vscode配置python代码开发

文章目录 1. 配置python运行环境2. 常用插件说明3. Vscode配置文件说明3.1 setting.json配置说明3.2 launch.json配置说明 4. 远程开发5. 其他配置 1. 配置python运行环境 安装python插件&#xff1a;点击VSCode左侧边栏中的扩展图标&#xff08;或按 CtrlShiftX&#xff09;&a…