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();
-
}
本示例可以在我的資源中下載