1

qt に奇妙な問題があります。一部の構成でアプリケーションが終了しません。

myWindowGUI を使用したプログラムとして ( を介して)、または純粋なコンソール アプリケーション ( を介して制御さmyConsoleれ、スレッド内で独自のループを実行してキーボード入力を記録する)として開始できるプログラムを用意することを目的としています。myObjectどちらの方法でも、終了はslotを呼び出すことによって行われます。これによりquitMyObject、いくつかのオブジェクトがクリーンアップされ、 ( )スロットsignalQuitapplicationに接続されているシグナルが送信されます。QApplicationappquit

残念ながら、アプリケーションは、ウィンドウが有効になっていて、終了コマンドがコンソールに入力された場合にのみ終了します (ただし、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();
} 
4

1 に答える 1

-1

MyConsoleクラスでそのコードを使用してみてください。

#include <QApplication>
...
qApp->quit();

また、終了する前にすべてのイベントループとスレッドを閉じる必要があります。

于 2012-08-13T18:47:54.393 に答える