[英]QT signal slot is not working
我在嘗試執行以下程序時遇到一個奇怪的問題
main.cpp
#include "sample.h"
#include <QList>
#include <unistd.h>
int main(int argc, char **argv)
{
A a;
a.callA();
while(1)
sleep(1);
return 0;
}
sample.cpp
#include "sample.h"
#include <QList>
#include <QMetaMethod>
#include <unistd.h>
Thread::Thread(A *a)
{
}
void Thread::run()
{
int i = 5;
while (i){
qDebug()<< i;
sleep(2);
i--;
}
emit processingDone(">>> FROM THREAD");
qDebug()<<"Emited signal from thread";
}
void A::callA()
{
qDebug()<<"from callA";
//moveToThread(thread);
thread->start();
//thread->run();
//emit signalA(">>> FROM CallA");
}
void A::slotA(QString arg)
{
qDebug()<<"from sloatA "<< arg;
}
sample.h
class A;
class Thread : public QThread
{
Q_OBJECT
public:
Thread(A *a);
~Thread(){
qDebug()<<"Thread is destroyed";
}
void run();
signals:
void processingDone(QString arg);
};
class A : public QObject{
Q_OBJECT
public:
A(){
qDebug()<<"Registering";
thread = new Thread(this);
connect(thread, SIGNAL(processingDone(QString)), this, SLOT(slotA(QString)));
connect(this,SIGNAL(signalA(QString)), this, SLOT(slotA(QString)));
}
public slots:
void callA();
void slotA(QString arg);
signals:
void signalA(QString arg);
private:
Thread *thread;
};
當我嘗試執行程序時,插槽沒有被調用嗎? 如果我將moveToThraed()放進去,那么代碼可以正常工作,但是不能滿足我的要求。 我有什么想念的嗎?
您沒有啟動主事件循環。
您的主要功能應如下所示:
QApplication app(argc, argv);
A a;
a.callA();
return app.exec();
如果接收線程中沒有運行事件循環,則Qt排隊的連接將無法工作。
當接收方對象位於發出信號的線程之外的其他線程中時, Qt::AutoConnection
使用Qt::QueuedConnection
,請參閱docs 。
Qt::QueuedConnection
通過將事件發布到目標線程(接收方QObject
所在的線程)的事件循環中來工作。 處理該事件(通過事件循環)后,將在目標線程中調用對插槽的調用。
在您的情況下,主線程始終卡在:
while(1)
sleep(1);
因此,它將永遠無法執行其他任何操作。
就像@Mike所說的那樣,您需要啟動QT的主事件循環。 每個QT應用程序都具有以下主要特征:
QApplication a(argc, argv);
return a.exec();
在您的情況下:
int main(int argc, char **argv)
{
QApplication app(argc, argv);
A a;
a.callA();
return app.exec();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.