Qt 发送带结构体数据的信号
2022/8/16 23:24:04
本文主要是介绍Qt 发送带结构体数据的信号,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
当发送的信号是结构体时:
-
第一步:定义一个结构体.并在包含该结构体的类里面注册该结构体,通过此方法
Q_DECLARE_METATYPE(T)
. -
第二步:作为信号输出时,不能直接传结构体,要先包装一下结构再传出去;接收时,也要拆开包装,才能拿到数据,这里借助 QVariant ;
-
最后一步:连接信号.
具体实例如下:
MainWindow.h:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtGui/QMainWindow> #include<QVariant> struct SRT_STUDENT { int age; char name[20]; }; Q_DECLARE_METATYPE(SRT_STUDENT) // 注册结构体 class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); void sendSig(); public slots: void receiveSig(QVariant varValue); signals: void sig_StudentInfo(QVariant varValue); // 自定义的信号 }; #endif // MAINWINDOW_H
MainWindow.cpp:
#include "mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { connect(this,SIGNAL(sig_StudentInfo(QVariant)),this,SLOT(receiveSig(QVariant))); } MainWindow::~MainWindow() { } void MainWindow::sendSig() { SRT_STUDENT stu; QVariant varValue; // QT中可以装任何数据的类 memset(&stu, 0, sizeof(stu)); stu.age = 20; strcpy(stu.name,"lili"); varValue.setValue(stu); // 把结构体添加QVariant for(int i=0;i<5;i++) { if(i==4) { emit sig_StudentInfo(varValue); break; } } } void MainWindow::receiveSig(QVariant varValue) { SRT_STUDENT stu1; stu1 = varValue.value<SRT_STUDENT>(); qDebug() << "age=" << stu1.age << "name=" << stu1.name; // age= 20 name= lili }
如此便可以发送一个带结构体的信号了.
注意,如果您打算在队列信号和槽连接或 QObject 的属性系统中使用该类型(QVariant),您还必须调用qRegisterMetaType()
,因为名称是在运行时解析的。即当涉及到跨线程连接时,在 connect 之前需要调用qRegisterMetaType()
注册此结构体;就像这样使用:
qRegisterMetaType<SRT_STUDENT>("SRT_STUDENT"); connect(this,SIGNAL(sig_StudentInfo(QVariant)),this,SLOT(receiveSig(QVariant)));
问题:为什么自定义类型信号槽在跨线程会报错?
因为跨线程时,当发送方信号发出时,此时接受对象所在的线程未取得控制权,所以需要发送方需要将信号放在信号队列中储存发送的参数,QT就会去构造对象,而我们定义的是自定义类型,所以需要使用qRegisterMetaType()
来注册,告诉QT怎么去构造对象.
这篇关于Qt 发送带结构体数据的信号的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?