我有类似的东西:
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)”循环。我需要做什么才能执行循环中的代码?
答案 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);
它应该按预期工作。参见
当控制返回到接收者线程的事件循环时,将调用该槽。插槽在接收器的线程中执行。