QT信号插槽不工作

jsa*_*aji 0 c++ qt

我在尝试执行以下程序时遇到了一个奇怪的问题

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;
}
Run Code Online (Sandbox Code Playgroud)

将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;
}
Run Code Online (Sandbox Code Playgroud)

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;
    };
Run Code Online (Sandbox Code Playgroud)

当我尝试执行程序时,没有调用插槽?如果我把moveToThraed(),那么代码将工作,但这不会为我的puprose服务.我错过了什么?

Mik*_*ike 8

您没有启动主事件循环.

你的主要功能应该是这样的:

QApplication app(argc, argv);
A a;
a.callA();
return app.exec();
Run Code Online (Sandbox Code Playgroud)

如果接收线程中没有运行事件循环,Qt排队连接将无法工作.

当接收器对象存在于发出信号的线程以外的线程中时,Qt::AutoConnection使用a Qt::QueuedConnection,请参阅docs.

A Qt::QueuedConnection通过将事件发布到目标线程的事件循环(接收器所在的线程QObject)来工作.当处理该事件时(通过事件循环),在目标线程中调用对槽的调用.

在您的情况下,主线程总是卡在:

while(1)
    sleep(1);
Run Code Online (Sandbox Code Playgroud)

因此,它永远无法执行任何其他操作.