0

我是 Qt 和 C++ 的新手,我正在尝试制作一个运行两个子线程 threadA 和 threadB 的程序。两个线程都是在 main.cpp 中创建的,如下所示:

ThreadA threadA;
threadA.start();
ThreadB threadB;
threadB.start();

然后这两个线程独立运行。我需要使线程A 能够调用线程B 中的方法,在进程中将数据作为参数传递。我尝试使用信号和插槽,将其添加到我的 main.cpp 中:

QThread::connect(&threadA, SIGNAL(mySignal(uint)),
    &threadB, SLOT(mySlot(uint)));

其中 threadA::mySignal(uint) 用于:

//a.h
signals:
  void mySignal(unsigned int blah);
//a.cpp
  emit mySignal(42);

并且 threadB::mySlot(uint) 在 b 中:

//b.h
public slots:
    void mySlot(unsigned int fluff);
//b.cpp
void threadB::mySlot(unsigned int fluff)
{ doStuff(fluff); ... }

该程序编译并成功运行,但我在调试日志中收到来自 QObject 的消息:

QObject::connect: No such slot QThread::mySlot(uint) in ../Project/main.cpp:42

这意味着编译器正在 QThread 而不是 threadB 中查找 mySlot。谁能告诉我这里哪里出错了?任何帮助将不胜感激,如果需要,我可以提供更多细节。

4

2 回答 2

1

首先对于你提到的错误

该程序编译并成功运行,但我在调试日志中收到来自 QObject 的消息:

QObject::connect: ../Project/main.cpp:42 中没有这样的插槽 QThread::mySlot(uint)

您正在使用mySlot并已定义MySlot请参考您的代码

你写

QThread::connect(&threadA, SIGNAL(mySignal(uint)), &threadB, SLOT( mySlot (uint)));

并定义

//bh

public slots:
    void MySlot(unsigned int fluff);
于 2013-08-05T11:07:14.733 回答
0

您可能缺少(并且可能)Q_OBJECT中的宏。threadb.hthreada.h

class ThreadB : public QObject 
{
   Q_OBJECT 
...

从文档: All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.

我还假设您已将QThread. 您应该知道它QThread用于管理线程,而不是处理数据。您应该QObject改为子类。阅读此内容以获取更多信息。

于 2013-08-05T12:03:50.873 回答