qt に奇妙な問題があります。一部の構成でアプリケーションが終了しません。
myWindow
GUI を使用したプログラムとして ( を介して)、または純粋なコンソール アプリケーション ( を介して制御さmyConsole
れ、スレッド内で独自のループを実行してキーボード入力を記録する)として開始できるプログラムを用意することを目的としています。myObject
どちらの方法でも、終了はslotを呼び出すことによって行われます。これによりquitMyObject
、いくつかのオブジェクトがクリーンアップされ、 ( )スロットsignalQuitapplication
に接続されているシグナルが送信されます。QApplication
app
quit
残念ながら、アプリケーションは、ウィンドウが有効になっていて、終了コマンドがコンソールに入力された場合にのみ終了します (ただし、slotQuitMyObject
ofmyObject
は常に呼び出されます)。それで、Qtが実際にメインイベントループを終了してプログラムを終了する基準は何なのだろうか。
コードは次のようになります。
int main(int argc, char *argv[])
{
bool enableWindow = false;
QApplication app(argc, argv, enableWindow);
MyUiAbstract* myConsole = new ConsoleUi(); // ConsoleUi inherits from MyUiAbstract, which inherits from QThread
MyWindow* myWindow = NULL; // MyWindow inherits from QMainWindow
if(enableWindow)
{
myWindow = new MyWindow();
myWindow->show();
}
MyObject* myObject = new MyObject(myConsole, myWindow, ...);
QObject::connect(myObject, SIGNAL(signalQuitQApplication()), &app, SLOT(quit()), Qt::QueuedConnection);
QObject::connect(myConsole, SIGNAL(signalQuitMyObject()), myObject, SLOT(slotQuitMyObject()), Qt::QueuedConnection);
QObject::connect(myWindow, SIGNAL(signalQuitMyObject()), myObject, SLOT(slotQuitMyObject()), Qt::QueuedConnection);
QObject::connect(myWindow, SIGNAL(signalQuitConsoleUI()), myConsole, SLOT(slotQuitMyUi()), Qt::QueuedConnection);
return app.exec();
}