gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:28:13 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com