【发布时间】:2018-01-30 17:17:13
【问题描述】:
我正在尝试在 Qt (C++) 中执行线程间通信。我有一个工作线程进行一些计算,我希望工作线程在完成后将其结果返回到主线程。因此我使用了一个连接,由于调试,我知道信号已成功发出,但它是未执行的插槽,我不明白为什么。
相关代码:
webcamClass::webcamClass(QObject *parent) : QObject(parent)
{
workerThread = new QThread(this);
workerClassObj = new workerClass();
//connect for image
connect(workerClassObj, SIGNAL(mySignal(QPixmap)), this, SLOT(mySlot(QPixmap)));
//connect(&workerClassObj, workerClass::mySignal(QPixmap), this, webcamClass::mySlot(QPixmap));
connect( workerThread, SIGNAL(started()), workerClassObj, SLOT(getImage()) );
workerClassObj->moveToThread(workerThread);
}
void webcamClass:: foo()
{
workerThread->start();
}
void workerClass::getImage()
{
qint64 successFailWrite;
QImage img;
QPixmap pixmap;
... do some stuff with pixmap...
qDebug()<<"going to emit result";
emit mySignal(pixmap);
qDebug()<<"emitted";
}
void webcamClass::mySlot(QPixmap p)
{qDebug()<<"this message should be displayed"; }
对应的头文件:
class workerClass : public QObject
{
Q_OBJECT
private:
public:
explicit workerClass(QObject *parent = nullptr);
signals:
void mySignal(QPixmap);
};
webcamClass::webcamClass(QObject *parent) : QObject(parent)
{
Q_OBJECT
public:
explicit webcamClass(QObject *parent = nullptr);
public slots:
void mySlot(QPixmap p);
private:
QThread *workerThread;
workerClass *workerClassObj;
};
上面的代码只是输出:
going to emit result
emitted
但不幸的是没有输出this message should be displayed。
webcamClass 属于父线程,而 workerClass 属于 - 你猜对了 - 工作线程。
有人可以解释如何设置我的连接以触发 mySlot() 吗?
谢谢!
【问题讨论】:
-
你试过移动 connect(workerClassObj, SIGNAL(mySignal(QPixmap)), this, SLOT(mySlot(QPixmap)));在 moveToThread 调用之前?顺便说一句,如果您使用 qt5,您最好使用新的信号/插槽连接 (wiki.qt.io/New_Signal_Slot_Syntax)
-
您是否使用
signals:声明了mySignal? -
@AMA 更新了我的帖子
-
@JLev 我知道新语法,你可以看到它就在那里,就在 cmets 的下面一行。是的,我尝试在 moveToThread 之前移动它,结果相同
-
你在哪里打电话给
webcamClass::foo()?此外,您对新信号/插槽语法的尝试似乎不正确。
标签: c++ multithreading qt