QT的信号槽可以传递int, short, double等c语言的常用类型的变量,也可以传递如QImage之类的QT支持 的类型。但是如何传递一个程序员自定义的结构体?
1)在定义结构体之后,要调用Q_DECLARE_METATYPE,向QT声明这个结构体
2)在main.cpp 中,用connect函数 将抛出此结构体的信号和接收此结构体的槽函数关联之前,要调用qRegisterMetaType()注册此结构体
看下面例子 ,在专门定义结构体的头文件里调用Q_DECLARE_METATYPE
-
-
-
-
-
-
-
-
-
typedef struct ST_ARB_STRUCT
-
{
-
double d;
-
int i;
-
char c;
-
} ST_ARB_STRUCT;
-
-
-
Q_DECLARE_METATYPE(ST_ARB_STRUCT);
-
//qRegisterMetaType<ST_ARB_STRUCT>();
-
-
-
-
-
定义类ArbStruct,负责向另一个类发射含有(ST_ARB_STRUCT)的信号sigArbStruct(ST_ARB_STRUCT)
-
-
-
-
-
-
-
class ArbStruct : public QObject
-
{
-
Q_OBJECT
-
public:
-
ArbStruct();
-
-
signals:
-
void sigArbStruct(ST_ARB_STRUCT);
-
-
public slots:
-
void OnRecvEmit(void);
-
};
-
-
特别地,这个类ArbStruct被封装为一个lib库,为的是证明即使发射信号的类的定义跟接收方的定义并不处于同一个项目里,信号槽仍然可以走通。
-
-
-
-
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)
-
-
-
-
-
-
-
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;
-
};
-
-
接收到ArbStruct发来的信号后,MainWindow将把信号内的数据显示在界面上
-
-
-
-
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:
-
-
-
-
-
-
-
-
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();
-
}
本示例可以在我的资源中下载