qRegisterMetaType跨线程传递信号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Qt 线程之间传递结构体,可以通过以下步骤实现: 1. 在结构体所在的头文件中包含 QDataStream 头文件。 2. 在结构体中添加一个函数,用于将结构体的数据写入到 QDataStream 中。 3. 在结构体中添加一个函数,用于从 QDataStream 中读取数据并将其填充到结构体中。 4. 在源线程中创建一个 QDataStream 对象,并使用结构体的写入函数将结构体数据写入到流中。 5. 将 QDataStream 对象转换为 QByteArray 对象,并使用信号和槽机制将 QByteArray 对象传递到目标线程。 6. 在目标线程中,将 QByteArray 对象转换为 QDataStream 对象,并使用结构体的读取函数将数据填充到结构体中。 下面是一个示例代码: ```c++ // MyStruct.h 文件 #include <QDataStream> struct MyStruct { int value1; QString value2; void writeToStream(QDataStream& stream) const { stream << value1 << value2; } void readFromStream(QDataStream& stream) { stream >> value1 >> value2; } }; Q_DECLARE_METATYPE(MyStruct) // 声明 MyStruct 类型,以便在信号和槽中使用 // MainWindow.cpp 文件 void MainWindow::onButtonClicked() { MyStruct data; data.value1 = 123; data.value2 = "Hello"; QByteArray buffer; QDataStream stream(&buffer, QIODevice::WriteOnly); data.writeToStream(stream); emit sendData(buffer); } void MainWindow::onDataReceived(const QByteArray& buffer) { MyStruct data; QDataStream stream(buffer); data.readFromStream(stream); // 处理接收到的数据 } // WorkerThread.cpp 文件 void WorkerThread::run() { qRegisterMetaType<MyStruct>(); // 注册 MyStruct 类型,以便在信号和槽中使用 connect(this, &WorkerThread::sendData, this, &WorkerThread::processData); } void WorkerThread::processData(const QByteArray& buffer) { MyStruct data; QDataStream stream(buffer); data.readFromStream(stream); // 处理接收到的数据 QByteArray newBuffer; QDataStream newStream(&newBuffer, QIODevice::WriteOnly); data.writeToStream(newStream); emit sendDataBack(newBuffer); } void WorkerThread::onDataSentBack(const QByteArray& buffer) { // 处理返回的数据 } ``` 在这个示例中,MyStruct 结构体包含两个成员变量:一个整数和一个字符串。writeToStream 和 readFromStream 函数分别用于将结构体数据写入到 QDataStream 中和从 QDataStream 中读取数据并填充到结构体中。在 MainWindow 类中,onButtonClicked 函数创建一个 MyStruct 实例,并将其写入到 QDataStream 中,然后将 QByteArray 对象发送到 WorkerThread 类中。在 WorkerThread 类中,processData 函数从 QByteArray 对象中读取 MyStruct 实例,并将其处理后,将其再次写入到 QByteArray 对象中,并将其发送回到 MainWindow 类中。在 onDataSentBack 函数中,MainWindow 类处理返回的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值