我是Qt和C ++的新手,我正在尝试制作一个运行两个子线程的程序,即threadA和threadB。这两个线程都是在main.cpp中创建的,如下所示:
ThreadA threadA;
threadA.start();
ThreadB threadB;
threadB.start();
然后两个线程独立运行。 我需要让threadA能够在threadB中调用一个方法,将数据作为参数传递给进程。我尝试使用信号和插槽,将其添加到我的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而不是myBlot的threadB。 谁能告诉我这里哪里出错了?任何帮助都会得到很好的理解,如果有必要,我可以提供更多细节。
答案 0 :(得分:1)
首先是你提到的错误
程序编译并运行成功,但我收到了一条消息 调试日志中的QObject:
QObject :: connect:没有这样的插槽QThread :: mySlot(uint)in ../项目/ main.cpp中:42
您正在使用mySlot
并已定义MySlot
,请参阅您的代码
你写过
QThread :: connect(& threadA,SIGNAL(mySignal(uint)), & threadB,SLOT( mySlot (uint)));
并定义了
// b.h
public slots:
void MySlot(unsigned int fluff);
答案 1 :(得分:0)
您可能遗漏了Q_OBJECT
中的threadb.h
宏(可能还有threada.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
的子类。 Read this了解更多相关信息。