イベント ループが開始される前にシグナル QCoreApplication::quit() が同期的にトリガーされると、シグナルは無視され、アプリケーションは永久にハングします。ただし、QTimer からトリガーされると、アプリケーションは正しく終了します。exec ループが開始される直前に戻ることができるタスクを開始する適切な方法は何でしょうか?
この動作を再現するための最小限のコードを次に示します。
ハング.h
#ifndef HANG_H
#define HANG_H
#include <QObject>
class hang : public QObject
{
Q_OBJECT
public:
explicit hang(QObject *parent = 0);
signals:
void done();
public slots:
void foo();
};
#endif // HANG_H
ハング.cpp
#include "hang.h"
#include <iostream>
hang::hang(QObject *parent) :
QObject(parent)
{
}
void hang::foo()
{
std::cout << "foo emit done()" << std::endl;
emit done();
}
main.cpp
#include <QCoreApplication>
#include <QTimer>
#include <hang.h>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
hang obj;
QObject::connect(&obj, SIGNAL(done()), &app, SLOT(quit()));
// obj.foo() does emit done(), but app hang on exec
obj.foo();
// If done() signal is triggered from the timer, app quits correctly
//QTimer::singleShot(0, &obj, SLOT(foo()));
return app.exec();
}