QT 多线程发送结构体数据信号
时间: 2023-10-23 07:14:32 浏览: 117
在 Qt 中,发送结构体数据信号需要注意以下几点:
1. 结构体必须在信号所在的头文件中定义。
2. 结构体必须是 Qt 可识别的数据类型,即需要使用 Q_DECLARE_METATYPE 宏声明该结构体类型。
3. 在发送信号时需要使用 QVariant 类型对结构体进行封装。
下面是一个简单的示例代码:
```cpp
// MyStruct.h
#ifndef MYSTRUCT_H
#define MYSTRUCT_H
#include <QString>
struct MyStruct
{
QString name;
int age;
};
#endif // MYSTRUCT_H
// MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include "MyStruct.h"
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
signals:
void sendStruct(const QVariant &data);
protected:
void run() override;
};
#endif // MYTHREAD_H
// MyThread.cpp
#include "MyThread.h"
#include <QMetaType>
MyThread::MyThread(QObject *parent) : QThread(parent)
{
// 注册 MyStruct 类型
qRegisterMetaType<MyStruct>("MyStruct");
}
void MyThread::run()
{
MyStruct data;
data.name = "Tom";
data.age = 18;
// 将结构体数据封装为 QVariant 类型并发送信号
emit sendStruct(QVariant::fromValue(data));
}
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "MyStruct.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void handleStruct(const QVariant &data);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "MyThread.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 注册 MyStruct 类型
qRegisterMetaType<MyStruct>("MyStruct");
MyThread *thread = new MyThread(this);
connect(thread, &MyThread::sendStruct, this, &MainWindow::handleStruct);
thread->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::handleStruct(const QVariant &data)
{
// 从 QVariant 类型中获取 MyStruct 数据
MyStruct myStruct = data.value<MyStruct>();
ui->label->setText(QString("%1 %2").arg(myStruct.name).arg(myStruct.age));
}
```
在这个示例中,我们在 MyStruct.h 中定义了一个简单的结构体 MyStruct,然后在 MyThread 类中使用 QVariant 类型对该结构体进行封装并通过 sendStruct 信号发送出去。在 MainWindow 类中,我们定义了一个 handleStruct 槽函数来接收信号并从 QVariant 类型中获取 MyStruct 数据,最后将其显示在 UI 上。注意,我们在 MainWindow 和 MyThread 中都使用了 qRegisterMetaType<MyStruct>("MyStruct") 来注册 MyStruct 类型,以便 Qt 可以识别该类型。
希望这个示例对你有所帮助!
阅读全文