QT的信号槽可以传递int, short, double等c语言的常用类型的变量,也可以传递如QImage之类的QT支持 的类型。但是如何传递一个程序员自定义的结构体?
1)在定义结构体之后,要调用Q_DECLARE_METATYPE,向QT声明这个结构体
2)在main.cpp 中,用connect函数 将抛出此结构体的信号和接收此结构体的槽函数关联之前,要调用qRegisterMetaType()注册此结构体
看下面例子 ,在专门定义结构体的头文件里调用Q_DECLARE_METATYPE
#ifndef PROTOCOL_H
#define PROTOCOL_H
#include <QMetaType>
#pragma pack(push, 1)
#if !defined(DEF_ST_ARB_STRUCT)
typedef struct ST_ARB_STRUCT
{
double d;
int i;
char c;
} ST_ARB_STRUCT;
#define DEF_ST_ARB_STRUCT
Q_DECLARE_METATYPE(ST_ARB_STRUCT);
//qRegisterMetaType<ST_ARB_STRUCT>();
#endif
#pragma pack(pop)
#endif // PROTOCOL_H
定义类ArbStruct,负责向另一个类发射含有(ST_ARB_STRUCT)的信号sigArbStruct(ST_ARB_STRUCT)
#ifndef ARBSTRUCT_H
#define ARBSTRUCT_H
#include "protocol.h"
#include <QObject>
class ArbStruct : public QObject
{
Q_OBJECT
public:
ArbStruct();
signals:
void sigArbStruct(ST_ARB_STRUCT);
public slots:
void OnRecvEmit(void);
};
#endif // ARBSTRUCT_H
特别地,这个类ArbStruct被封装为一个lib库,为的是证明即使发射信号的类的定义跟接收方的定义并不处于同一个项目里,信号槽仍然可以走通。
#include "arbstruct.h"
ArbStruct::ArbStruct()
{
}
void ArbStruct::OnRecvEmit(void)
{
ST_ARB_STRUCT stMsg;
stMsg.d = 6.5;
stMsg.c = 0;
stMsg.i = -1;
emit sigArbStruct(stMsg);
}
在主工程里定义另一个类,负责接收sigArbStruct(ST_ARB_STRUCT)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "protocol.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
signals:
void sigClicked(void);
public slots:
void OnRecvArbStruct(ST_ARB_STRUCT);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
接收到ArbStruct发来的信号后,MainWindow将把信号内的数据显示在界面上
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL(clicked()), this, SIGNAL(sigClicked()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::OnRecvArbStruct(ST_ARB_STRUCT stMsg)
{
ui->label->setText(QString("d = %1, i = %2, c = %3")
.arg(stMsg.d).arg(stMsg.i).arg(int(stMsg.c)));
}
最后在main.cpp里联系两个类,注意用了qRegisterMetaType:
#include "mainwindow.h"
#include <QApplication>
#include "protocol.h"
#include "arbstruct.h"
#pragma comment(lib, "ArbStruct.lib")
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ArbStruct arb;
MainWindow w;
qRegisterMetaType<ST_ARB_STRUCT>("ST_ARB_STRUCT");
QObject::connect(&arb, SIGNAL(sigArbStruct(ST_ARB_STRUCT)), &w, SLOT(OnRecvArbStruct(ST_ARB_STRUCT)));
QObject::connect(&w, SIGNAL(sigClicked()), &arb, SLOT(OnRecvEmit()));
w.show();
return a.exec();
}
本示例可以在我的资源中下载