Qml使用cpp文件的信号槽

文章目录

  • 一、C++文件Demo
  • 二、使用步骤
    • 1. 初始化C++文件和QML文件,并建立信号槽
    • 2.在qml中调用


一、C++文件Demo

Q_INVOKABLE是一个Qt元对象系统中的宏,用于将C++函数暴露给QML引擎。具体来说,它使得在QML代码中可以直接调用C++类中被标记为Q_INVOKABLE的成员函数。

public:SerialPort();// 返回可用串口Q_INVOKABLE QStringList availablePorts();// 打开串口Q_INVOKABLE bool open(QString portName, QString buadRate, QString dataBits, QString stopBits,QString parity, QString flowControl);// 关闭串口Q_INVOKABLE void close();// 直接调用接口Q_INVOKABLE void say();signals://返回串口打开信息Q_INVOKABLE void openMsg(bool open, QString error);//接口,用于多线程Q_INVOKABLE void sendMsg(QString msg);public slots://void sendMsgSlot(QString msg);private:QThread* m_thread;QSerialPort* m_port;QMutex m_mutex;
m_port = new QSerialPort();
connect(this, &SerialPort::sendMsg, this, &SerialPort::sendMsgSlot);tts = new QTextToSpeech(this);m_thread = new QThread;
m_thread->setObjectName("串口线程");
this->moveToThread(m_thread);
connect(m_thread, &QThread::finished, this, &QThread::deleteLater);
connect(m_thread, &QThread::finished, this, &SerialPort::deleteLater);
m_thread->start();
QStringList SerialPort::availablePorts()
{QStringList list;foreach(auto info, QSerialPortInfo::availablePorts()) list.append(info.portName());list<<"COM11"<<"COM22";return list;
}
bool SerialPort::open(QString portName, QString buadRate, QString dataBits, QString stopBits,QString parity, QString flowControl)
{bool ok = false;QString errstr = "m_port异常";{QMutexLocker locker(&m_mutex);if(!m_port){emit openMsg(false, errstr);locker.unlock();return false;}m_port->setPortName(portName);m_port->setBaudRate(buadRate.toInt());m_port->setDataBits((QSerialPort::DataBits)dataBits.toInt());m_port->setStopBits((QSerialPort::StopBits)stopBits.toInt());m_port->setParity((QSerialPort::Parity)parity.toInt());m_port->setFlowControl((QSerialPort::FlowControl)flowControl.toInt());ok = m_port->open(QIODevice::ReadWrite);errstr = m_port->errorString();}emit openMsg(ok, errstr);return ok;
}
void SerialPort::close()
{QMutexLocker locker(&m_mutex);if(m_port && m_port->isOpen()) m_port->close();
}
void SerialPort::say()
{qDebug()<<"SerialPort CurrrntThread = "<< QThread::currentThread();qDebug()<<"---------------------------------------------------------";QString text = "2,8,k,1,0";tts->say(text);
}
void SerialPort::sendMsgSlot(QString msg)
{qDebug()<<"SerialPort CurrrntThread = "<< QThread::currentThread();qDebug()<<msg;qDebug()<<"---------------------------------------------------------";
}

二、使用步骤

1. 初始化C++文件和QML文件,并建立信号槽

qml中的槽函数也是定义成signal, 所以connect时,槽函数也是SIGNAL()

serial = new SerialPort;
//serial 类向 QML 对象的上下文公开数据
ui->quickWidget_2->rootContext()->setContextProperty("serial", serial);
//根据窗口大小调整QML大小
ui->quickWidget_2->setResizeMode(QQuickWidget::SizeRootObjectToView);
// 
ui->quickWidget_2->setSource(QUrl("qrc:/Form02.qml"));
//
QObject* obj = ui->quickWidget_2->rootObject();
// 调用qml中信号或者槽函数,调用成功返回true,否则false
// 根节点,被调用信号或槽,连接方式,被调用信号或槽的参数1, 被调用信号或槽的参数2(最多10个参数)
if(QMetaObject::invokeMethod(obj, "slotOpenSerial", Qt::DirectConnection, Q_ARG(bool, true), Q_ARG(QString, "")))connect(serial, SIGNAL(openMsg(bool,QString)), obj, SIGNAL(slotOpenSerial(bool,QString)));

2.在qml中调用

QGroupButton 自定义的按钮组

Item {id: itemLayout.fillWidth: trueLayout.preferredHeight: 36property alias checkedButton: btngroup.checkedButtonproperty int btnIndexChanged: 0onBtnIndexChangedChanged: {if(btnIndexChanged == 0) {checkedButton = ok}else {checkedButton = cancle}}ButtonGroup {id: btngroupexclusive: truebuttons: row.childrenonCheckedButtonChanged:{console.log("button text: ", checkedButton.text)btnIndexChanged = checkedButton == ok ? 0 : 1;}}Rectangle{id: rectanchors.fill: parentRowLayout {id: rowanchors.fill: rectspacing: 6QButton{id: ok; text: "OK"}QButton{id: cancle; text: "Cancle"}}}
}
signal slotOpenSerial(bool isOpen, string error)onSlotOpenSerial: {//console.log(isOpen, error)if(!isOpen){group.btnIndexChanged = 1}
}

qrc:/Form02.qml

//自定义的按钮组
QGroupButton{id: groupLayout.columnSpan: 2Layout.fillWidth: trueonCheckedButtonChanged:{if(checkedButton.text == "OK"){open =  serial.open(portName.currentText, cboxBuad.currentText, dataBits.currentText,stopBits.currentText, parity.currentText, flowControl.currentText);console.log("serial return: ", open)}else{serial.close()}}
}

下面代码仅看这段:
QButton{
text: "1";
onClicked: {
//直接调用接口
serial.say();
//通过信号调用
serial.sendMsg("TTTT");
}
}

Rectangle {Layout.columnSpan: 2Layout.fillWidth: trueLayout.fillHeight: truecolor: "#156448"Flow {anchors.fill: parentanchors.margins: 9spacing: 6QButton{text: "1";onClicked: {serial.say();serial.sendMsg("TTTT");}}QButton{text: "2"}QButton{text: "3"}QButton{text: "4"}QButton{text: "5"}QButton{text: "6"}QButton{text: "7"}QButton{text: "8"}QButton{text: "9"}QButton{text: "10"}QButton{text: "11"}QButton{text: "12"}QButton{text: "13"}QButton{text: "14"}QButton{text: "15"}QButton{text: "16"}QButton{text: "17"}QButton{text: "18"}QButton{text: "19"}Rectangle {width:60height: 26color: "green"property alias text: in1.textonTextChanged: console.log(text)TextInput {id: in1anchors.fill: parenttext: "input"color: "red"KeyNavigation.tab: in2selectByMouse: true}}Rectangle {width:60height: 26color: "green"TextInput {id: in2anchors.fill: parenttext: "input"color: "red"KeyNavigation.tab: in1KeyNavigation.up: in1}}Loader {sourceComponent: testComponent}}
}

结果如图:
//---------------------------------------------------------
MainWindow CurrentThread = QThread(0x24ce850) //主线程
//---------------------------------------------------------
qml: button text: OK // 点击OK按钮打印
qml: button text: Cancle // 打开串口失败,取消OK按钮,默认Cancle按钮被点击打印
qml: serial return: false // serial.open(…)返回值打印
SerialPort CurrrntThread = QThread(0x24ce850) // serial.say() 函数运行的线程
//---------------------------------------------------------
SerialPort CurrrntThread = QThread(0xfcc9f0, name = “串口线程”) // serial.sendMsg(“TTTT”)运行的线程
“TTTT” // 槽函数打印
//---------------------------------------------------------

在这里插入图片描述


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

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

相关文章

某手机大厂员工爆料:40岁被裁,每月给88000补贴,连续给12个月,第二年减半,感觉废掉了!...

精彩回顾&#xff1a;进了央企&#xff0c;拿了户口&#xff0c;却感觉被困住了。 人生没有所谓的终点&#xff0c;只有不断再出发的起点&#xff0c;裁员只是人生的一个转角&#xff0c;而非尽头。 在时代的浪潮下&#xff0c;即使身处大厂&#xff0c;依然难逃被裁员的命运。…

NX二次开发UF_CAM_ask_lower_limit_plane_usage 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_lower_limit_plane_usage Defined in: uf_cam_planes.h int UF_CAM_ask_lower_limit_plane_usage(tag_t object_tag, UF_PARAM_lwplane_usage_t * usage ) overview 概述 Query the usa…

Shell脚本:Linux Shell脚本学习指南(第二部分Shell编程)一

第二部分&#xff1a;Shell编程&#xff08;一&#xff09; 这一章我们正式进入 Shell 脚本编程&#xff0c;重点讲解变量、字符串、数组、数学计算、选择结构、循环结构和函数。 Shell 的编程思想虽然和 C、Java、Python、C# 等其它编程语言类似&#xff0c;但是在语法细节方…

Java Swing实现员工工资管理系统(含教程) 可带数据库 Java课程设计

7. 员工工资管理系统 视频教程&#xff1a; 【课程设计】员工工资管理系统-Java Swing-你的课程我设计 功能描述&#xff1a; 系统员工有"工号"、 “姓名”、“性别”、“岗位”、 "入职年份 "、"密码"等属性&#xff1b; 员工使用工号密码登录…

MacOs 删除第三方软件

AppStore下载的软件 如果删除AppStore下载的软件&#xff0c;直接长按软件&#xff0c;点击删除或拖到废纸篓就可以完成软件的删除 第三方软件 但是第三方下载的软件&#xff0c;无法拖进废纸篓&#xff0c;长按软件也没有右上角的小叉 可以通过以下方法实现对软件的卸载 …

2023美亚杯个人赛复盘(三)

案件基本情况&#xff1a; &#xff08;一&#xff09;案情 2023月8月的一天&#xff0c;香港警方在调查一起网络诈骗案件时&#xff0c;发现有三名本地男子&#xff0c;分別为李大輝&#xff08;李大辉&#xff09;&#xff0c;浩賢(浩贤)和Elvis CHUI&#xff0c;并确信这三名…

软件安全检测赋能赣州发展,开源网安与赣州国投完成签约

​11月20日&#xff0c;开源网安与赣州章贡区数智国投科技有限公司签订投资协议&#xff0c;签约后双方将在赣州打造软件供应链安全检测中心&#xff0c;以强大的软件测试能力为数字政府、数字经济等领域提供全面安全检测和软件安全运营监测等服务&#xff0c;提升软件的安全与…

电商数据|电商API接口|电商数据分析都会用到的接口不用再找了

导读&#xff1a;上半年&#xff0c;网络零售行业发展迅速&#xff0c;货架电商、直播电商、生鲜电商等领域动作频频。京东“百亿补贴”上线&#xff0c;张勇宣布启动“16N”组织变革&#xff0c;盒马启动上市计划&#xff0c;拼多多APP新增直播入口&#xff0c;快手升级货架场…

JavaScript拖放操作的实现

在页面中设置2个框&#xff1a;一个是被拖放的框&#xff0c;一个是拖放的目的地框。在拖动的时候&#xff0c;只有当鼠标位于拖放的目的地框上方的时候&#xff0c;放开鼠标的时候&#xff0c;被拖放的框&#xff0c;才被移动到鼠标所在的位置&#xff1b;而在其他地方放开鼠标…

SVG 多边形 <polygon>,矩形<rect>的示例代码

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

WPS或Excel查找A列中有B列没有的值

就这一行代码&#xff1a; 在C列输入&#xff1a; IF(COUNTIF(B:B,A1)>0,"该行A列中值B列有","该行A列中值B列没有")

企业微信将应用安装到工作台

在上篇中介绍了配置小程序应用及指令、数据回调获取第三方凭证&#xff1b; 本篇将介绍如何将应用安装到企业工作台。 添加测试企业 通过【应用管理】->【测试企业配置】添加测试企业。 通过企业微信扫描二维码添加测试企业。 注意&#xff1a;需要扫描的账号为管理员权限…

蓝桥杯单片机综合练习——工厂灯光控制

一、题目 二、代码 #include <reg52.h>sfr AUXR 0x8e; //定义辅助寄存器sbit S5 P3^2; //定义S5按键引脚 sbit S4 P3^3; //定义S4按键引脚unsigned char led_stat 0xff; //定义LED当前状态 unsigned char count 0; //定义50ms定时中断累…

【Docker】从零开始:2.Docker三要素

【Docker】从零开始&#xff1a;2.Docker三要素 DockerDocker支持的系统CentOS DockerDocker三要素Docker镜像(Image):Docker容器(Container):1.从面向对象角度2.从镜像容器角度 Docker仓库(Repository) 总结 Docker docker官网&#xff1a;http://www.docker.com 仓库-Docker…

leetcode 每日一题复盘(11.20~11.26)

leetcode 746 使用最小花费爬楼梯 虽然是简单题但还是要说一下,感觉做题的思路还是不够清晰,好的是知道状态是最低花费,知道围绕所求的目标进行展开,倒推出递推公式 一开始写的递推公式是dp[i]dp[i-1]min(cost[i-2],cost[i-1]),写出了一个类似贪心算法的东西,归根结底还是对dp…

Android13 新增 Stable AIDL接口

问题描述&#xff1a; 我需要在netd aidl 中添加新的接口&#xff1a; 设置网卡MAC地址&#xff1a; void setHardwareAddress(in utf8InCpp String iface, in utf8InCpp String hwAddr); 背景&#xff1a; Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持&…

机器学习:十大算法快速回顾

一、说明 对于机器学习的是个经典算法&#xff0c;本篇将展示一个回顾&#xff0c;注意&#xff0c;本篇不是具体原理信息介绍&#xff0c;没有代码&#xff0c;但是对于初学者是一个有益的导读。 二. 线性回归 2.1 算法描述 有没有想过数据奇才如何预测未来&#xff1f;输入线…

Linux安装rabbitMq(亲测可用)解决只能本地访问的问题

安装er https://blog.csdn.net/laterstage/article/details/131513793?spm1001.2014.3001.5501下载mq wget --content-disposition "https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm?distro_v…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《氢耦合区域综合能源系统集群双层博弈随机优化调度策略》

这个标题涉及到复杂的领域&#xff0c;主要包括氢能源、能源系统集群、双层博弈、随机优化和调度策略。我将分步解读这个标题&#xff1a; 氢耦合区域综合能源系统集群&#xff1a; 氢能源&#xff1a; 这指的是使用氢作为能源的系统&#xff0c;可能是指氢燃料电池等。区域综合…

TensorFlow实战教程(二十六)-什么是生成对抗网络GAN?基础原理和代码普及

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了Keras实现经典的深度学习文本分类算法,包括LSTM、BiLSTM、BiLSTM+Attention和CNN、TextCNN。这篇文章将详细介绍生成对抗网络GAN的基础知识,包括什么是GAN、常用算法(CGAN、DCGAN、…