Qt发出信号并继续执行

时间:2013-12-13 22:15:19

标签: qt signals

我有类似的东西:

Prueba.h

#include <QObject>
class Prueba:public QObject
{
    Q_OBJECT
 private:
     bool waiting;
 public:
     Prueba();
     void test();
     void fin();
 signals:
     void comenzo();
};

Prueba.cpp

#include "prueba.h"
#include <QDebug>

Prueba::Prueba()
{
    waiting=true;
}

void Prueba::test()
{
    qDebug()<<"Comenzando";
    emit(comenzo());
    while(waiting) {
        qDebug()<<"Esperando";
    }
    qDebug()<<"Termino";
}

void Prueba::fin()
{
    waiting=false;
}

Principal.h

#include <QObject>
#include "prueba.h"
class Principal:public QObject
{
    Q_OBJECT
 private:
     Prueba * prueba;
 public:
     Principal();
 private slots:
     void processSignal();
};

Principal.cpp

#include <QDebug>

Principal::Principal()
{
    prueba=new Prueba();
    connect(prueba,SIGNAL(comenzo()),SLOT(processSignal()));
    prueba->test();
}

void Principal::processSignal()
{
    for(int i=0;i<1000;i++) {
        qDebug()<<"Algo";
    }
    prueba->fin();
}

当我调用prueba-&gt; test()并发出信号“comenzo”时,Principal :: proccessSignal完全执行,并且永远不会进入“while(waiting)”循环。我需要做什么才能执行循环中的代码?

1 个答案:

答案 0 :(得分:1)

我的猜测是你的信号连接。默认情况下,Qt将执行您的信号作为对插槽的直接调用,对象位于同一个线程中,如您所见:

QMetaObject::Connection QObject::connect(
    const QObject * sender, const char * signal, 
    const char * method, Qt::ConnectionType type = Qt::AutoConnection) const

请参阅Qt :: ConnectionType http://qt-project.org/doc/qt-5.0/qtcore/qt.html#ConnectionType-enum

所以如果你使用

Qt::QueuedConnection
信号连接

connect(prueba,SIGNAL(comenzo()),SLOT(processSignal()), Qt::QueuedConnection);

它应该按预期工作。参见

  

当控制返回到接收者线程的事件循环时,将调用该槽。插槽在接收器的线程中执行。