我有一个 Qt 应用程序,它是使用 Qt Creator 及其附带的 GUI 工具开发的。我有一个主线程 TheGui
和一个由主线程 WorkerThread
创建的工作线程(称为 thread
)。
我遇到的问题是当我使用
在 GUI 中创建插槽时public slot:
void updateTable(string str);
在 GUI 的头文件中和工作线程的头文件中的信号 void sendList(string str);
中,插槽永远不会被调用。我使用
connect(&thread, SIGNAL(sendList(string str),
this, SLOT(updateTable(string str)));
在 GUI cpp 文件的构造函数中。我做了类似的事情,除了工作线程中的插槽和来自 GUI 的信号,它工作正常。我通过使用调试器知道信号 sendList 确实被调用了,它只是永远不会进入它。
有什么想法吗?
最佳答案
因为信号和槽在不同的线程上,所以它们之间的连接具有
Qt::QueuedConnection
类型。对于排队的连接,Qt 必须能够保存信号参数的拷贝,以便稍后将它们传递给插槽。
因此,要通知 Qt 该类型是可复制的,您必须像这样在 Qt 的元对象系统(参见 QMetaType)中注册它:// 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<std::string>();
参数名称不应包含在
QObject::connect
中调用,类型名称应与您传递给Q_DECLARE_METATYPE
的名称完全相同:connect(&thread, SIGNAL(sendList(std::string), this, SLOT(updateTable(std::string)));
您还可以使用 QString
或 QByteArray
,已经注册,而不是 std::string
,因为这些函数是槽和信号,因此已经是特定于 Qt 的。
关于c++ - Qt QThread 使用信号/插槽从工作人员到 gui 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881052/