Qt 发送带结构体数据的信号
2023-09-27 14:29:13 时间
当发送的信号是结构体时:
-
第一步:定义一个结构体.并在包含该结构体的类里面注册该结构体,通过此方法
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连接MySql并创建表号、写入数据、删除数据
- 【Qt开发】QT中显示图像数据
- 【Linux开发】【Qt开发】嵌入式Qt程序使用触屏或USB鼠标方式
- Qt 中的消息对话框
- QMutex使用 & Qt的QMediaPlayer和QVideoWidget的使用
- PyQt(Python+Qt)学习随笔:字体writingSystem、ProportionalFonts、MonospacedFonts的含义以及QFontComboBox字体组合框详解
- PyQt(Python+Qt)学习随笔:QTreeWidget中获取可见项视口位置矩形的visualItemRect方法
- PyQt(Python+Qt)学习随笔:QTreeWidgetItem项中列数据的访问方法
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的locale属性
- QT右键菜单的建立步骤
- 使用QT操作sqlite(3)--表单数据的操作
- QT BLE 上位机开发学习记录
- 63.QT-重写QStackedWidget模仿iphone的home界面,实现左右滑动
- OpenCascade 6.7.1 and Qt 5
- qt之QCustomPlot与qchart初级应用-----绘制动态曲线
- qt在不同系统上读写文件以二进制数据流处理数据时严重注意问题0x0a变成0x0d 0x0a问题!
- qt for Android数据库连接sqlite3
- qt解决用sqliete3超过256数据无法保存,无法获取256行之后数据问题
- qt之sql删除间隔大量数据
- A40i使用笔记:使用QT调用aplay播放wav音频/混音