ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt 发送带结构体数据的信号

2022-08-16 14:35:40  阅读:166  来源: 互联网

标签:QVariant Qt 发送 stu 信号 include MainWindow 结构


当发送的信号是结构体时:

  • 第一步:定义一个结构体.并在包含该结构体的类里面注册该结构体,通过此方法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怎么去构造对象.


标签:QVariant,Qt,发送,stu,信号,include,MainWindow,结构
来源: https://www.cnblogs.com/linuxAndMcu/p/16591417.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有