簡體   English   中英

QT信號槽不工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM