信号没有从另一个线程调用槽
Posted
技术标签:
【中文标题】信号没有从另一个线程调用槽【英文标题】:Signal is not calling slot from another thread 【发布时间】:2016-08-02 07:35:16 【问题描述】:我正在尝试使用以下方法从另一个线程更新 gui:https://***.com/a/14546167/2236297
这是我的工作线程:
class WorkerThread : public QThread
void run()
while(1)
//QTcpSocket messenger;
//messenger.connectToHost("192.168.1.20", 61000);
//if(!messenger.waitForConnected(3000))
//
emit progressChanged("111");
//
// Define signal:
signals:
void progressChanged(QString q)
;
唯一的区别是我将这个类声明为一个内部类并定义了progressChanged。在他的示例中,信号只是声明了,没有定义。
我的 onProgressChanged:
void ApplicationController::onProgressChanged(QString info)
// Processing code
ui.label_2->setText("Latest info: " + info);
这就是我在构造函数中启动线程的方式:
ApplicationController::ApplicationController(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
ui.setupUi(this);
WorkerThread *workerThread = new WorkerThread;
// Connect our signal and slot
connect(workerThread, SIGNAL(progressChanged(QString)),
SLOT(onProgressChanged(QString)));
// Setup callback for cleanup when it finishes
connect(workerThread, SIGNAL(finished()),
workerThread, SLOT(deleteLater()));
// Run, Forest, run!
workerThread->start(); // This invokes WorkerThread::run in a new thread
问题是:为什么我的插槽没有被调用。我应该改变什么?
编辑
改变了工作线程。
.h 文件
class WorkerThread : public QThread
Q_OBJECT
public:
WorkerThread();
~WorkerThread();
void run();
private:
signals:
void progressChanged(QString info);
;
.cpp 文件
WorkerThread::WorkerThread()
WorkerThread::~WorkerThread()
void WorkerThread::run()
while(1)
QTcpSocket messenger;
messenger.connectToHost("192.168.1.20", 61000);
if(!messenger.waitForConnected(3000))
emit progressChanged((QString("%1").arg(messenger.error())));
在调试中,发射有效。但是在 main 函数中没有调用 slot。
【问题讨论】:
问题是…… 您已经定义了信号的主体,而信号只应被声明(定义由 moc 有效生成)。您还缺少类定义中的Q_OBJECT
宏。看看docs.。另请注意,在嵌套类中声明信号曾经存在问题——不确定是否仍然存在。
我已按照您的建议更改了 workerThread。仍然没有变化。
***.com/a/26422155/1421332
【参考方案1】:
已解决
有多个错误:
首先应将workerThread定义为单独的类而不是内部类。
slot 应该在 slot 下声明:
公共插槽: void onProgressChanged(QString info);
【讨论】:
以上是关于信号没有从另一个线程调用槽的主要内容,如果未能解决你的问题,请参考以下文章