在前面的博客里,我介绍了利用Q_DECLARE_METATYPE和qRegsterMetaType来传递自定义的结构体。但是这样做有个缺点:qRegisterMetaType()只能在main()函数里才能发挥作用。https://blog.csdn.net/Kelvin_Yan/article/details/70054282介绍了利用QVariant来传递自定义结构体的办法。有了这个办法,即使不在main()函数里调用qRegisterMetaType也能传递自定义数据。
建立一个工程,包含两个窗体:MainWindow和Emitter。两者通过信号sigVarnt()和槽OnRecvVarnt()传递QVariant,而QVariant实际上是一个自定义结构体。当MainWIndow::OnRecvVarnt()接收到信号之后,会将QVariant重新转化为结构体,并显示在界面上。
头文件:
#ifndef PROTOCOL_H
#define PROTOCOL_H
#include <QMetaType>
#pragma pack(push, 1)
#if !defined(DEF_ST_DUMMY)
typedef struct ST_DUMMY
{
int i;
float f;
char arr[10];
} ST_DUMMY;
Q_DECLARE_METATYPE(ST_DUMMY)
#define DEF_ST_DUMMY
#endif
#pragma pack(pop)
#endif // PROTOCOL_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QVariant>
#include "emitter.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Emitter m_emitter;
public slots:
void OnRecvVarnt(QVariant);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#ifndef EMITTER_H
#define EMITTER_H
#include <QWidget>
#include <QVariant>
class Emitter : public QWidget
{
Q_OBJECT
public:
explicit Emitter(QWidget *parent = 0);
signals:
void sigVarnt(QVariant);
public slots:
void OnTrigger(void);
};
#endif // EMITTER_H
cpp文件:
#include "emitter.h"
#include "protocol.h"
Emitter::Emitter(QWidget *parent) : QWidget(parent)
{
}
void Emitter::OnTrigger(void)
{
ST_DUMMY stDummy;
stDummy.i = 1;
//char * p = "huii"
memcpy(stDummy.arr, "abd", strlen("abd"));
stDummy.f = 8.9;
QVariant varnt;
varnt.setValue(stDummy);
emit sigVarnt(varnt);
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "protocol.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&m_emitter, SIGNAL(sigVarnt(QVariant)), this, SLOT(OnRecvVarnt(QVariant)));
connect(ui->Btn, SIGNAL(clicked()), &m_emitter, SLOT(OnTrigger()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::OnRecvVarnt(QVariant vnrt)
{
ST_DUMMY stDummy = vnrt.value<ST_DUMMY>();
QString qstrMsg = QString("i = %1, f = %2, arr = %3").arg(stDummy.i, 10).arg(stDummy.f).arg(QString(stDummy.arr));
ui->label->setText(qstrMsg);
}
效果:
点击pushubutton之后,界面上显示出了stDummy的三个成员的取值: