繁体   English   中英

Qt QThread使用信号/插槽从工人到GUI的麻烦

[英]Qt QThread trouble using signal/slot going from worker to gui

我有一个使用Qt Creator和随附的GUI工具开发的Qt应用程序。 我有一个主线程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确实已被调用,但它从未被调用过。

有什么想法吗?

  1. 因为信号和插槽位于不同的线程上,所以它们之间的连接具有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>(); 
  2. 参数名称不应包含在QObject::connect调用中,类型名称应与您传递给Q_DECLARE_METATYPE名称完全相同:

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

您还可以使用已经注册的QStringQByteArray代替std::string ,因为这些函数是插槽和信号,因此已经是Qt特定的。

确定确实建立了连接? 如果connect调用有任何问题,通常在cerr上会有一些调试输出。

其次,我认为您有错别字-如果您从代码中复制了connect调用,然后知道在SIGNAL中缺少括号-应该是

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

第三,作为信号/插槽参数传递的是什么? 它是std :: string吗? 线程之间的连接必须是排队的连接。 排队连接只能将使用Q_DECLARE_METATYPE宏声明并通过qRegisterMetaType注册的类型用作参数。 据我所知,默认情况下Qt不会为std::string声明它们,因为它更喜欢QString 如果未将这些代码添加到代码中,则可能是失败的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM