QT信号插槽不工作

时间:2016-09-22 11:24:24

标签: 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;
}

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(),那么代码将工作,但这不会为我的puprose服务。我缺少什么?

2 个答案:

答案 0 :(得分:8)

您没有开始主赛事循环。

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

QApplication app(argc, argv);
A a;
a.callA();
return app.exec();

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

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

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

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

while(1)
    sleep(1);

所以,它永远无法执行其他任何事情。

答案 1 :(得分:0)

像@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();
}