QT信号槽传递自定义结构体
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();
-
}
本示例可以在我的资源中下载
分类:
[0021] QT
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」