qt qthead里如何响应信号_Qt QThread问题使用信号/槽从工人到gui

I have a QT application that was developed using QT Creator and the GUI tool that accompanies it. I have a main thread, TheGui and a worker thread that is created by the main thread, WorkerThread (called thread).

The problem I'm having is when I create a slot in the GUI by using

public slot:

void updateTable(string str);

within the header file of the GUI and signal void sendList(string str); within the header file of the worker thread, the slot never gets called. I connected the two using

connect(&thread, SIGNAL(sendList(string str),

this, SLOT(updateTable(string str)));

within the constructor in the GUI cpp file. I did something similar except with the slot in the worker thread and signal from the GUI and it worked fine. I know from using the debugger that the signal sendList is indeed getting called, it is just never going into it.

Any thoughts?

解决方案Because the signal and the slot are on distinct threads, the connection between them has the Qt::QueuedConnection type. And for queued connections, Qt has to be able to save a copy of the signal parameters, to pass them later to the slot.

So, to inform Qt that the type is copyable, you have to register it with Qt's meta-object system (see QMetaType) like this:

// This macro call should be put in one of your .h files

Q_DECLARE_METATYPE(std::string)

// You should call this function before any (queued)

// signal/slot connection involving the type

qRegisterMetaType<:string>();

The parameter name shouldn't be included in the QObject::connect call, and the type names should be exactly the same as the ones you passed to Q_DECLARE_METATYPE:

connect(&thread, SIGNAL(sendList(std::string), this, SLOT(updateTable(std::string)));

You can also use QString or QByteArray, which are already registered, instead of std::string, since these functions are slots and signals and as such are already Qt specific.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值