c++ - Qt QThread 使用信号/插槽从工作人员到 gui 的问题

标签 c++ qt qthread

我有一个 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 确实被调用了,它只是永远不会进入它。

有什么想法吗?

最佳答案

  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 的。

关于c++ - Qt QThread 使用信号/插槽从工作人员到 gui 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881052/

相关文章:

c++ - 在线程应用程序中从 QtScript 调用的 Qt 槽

c++ - MakeFile 只编译一个文件

android - 是否有使用C/C++和SDL对Android进行编程的入门指南?

c++ - QTextEdit 插入不一致的 HTML(重复/一致地执行相同的操作时)

c++ - 仅计算 "core"QImage 数据(不包括元数据)的 QCryptographicHash

c++ - QThread 和自定义类

c++ - 误报 : Undefined or garbage value returned to caller

c++ - 如何将值从std :optional without calling the destructor?中移出

qt - 在 QML 中显示来自对 XmlHttpRequest (REST) 的响应的图像

Qt,如何立即暂停QThread