2012-08-13 4 views
1

이상한 Qt 문제가 있습니다. 일부 구성에서는 응용 프로그램이 종료되지 않습니다.Qt 콘솔 응용 프로그램을 어떻게 종료합니까? QApplication :: quit() 슬롯이 작동하는 기준이 있습니까?

아이디어는 GUI (myWindow 통해) 또는 순수한 콘솔 응용 프로그램 (키보드 입력을 기록하기 위해 자체 루프를 실행하는 myConsole을 통해 제어되는 프로그램)로 시작될 수있는 프로그램을 갖는 것입니다. . 어느 쪽이든 종료하려면 myObject 슬롯 quitMyObject으로 전화를 걸어 일부 객체를 정리하고 signalQuitapplication 신호를 내고 QApplication (app) quit 슬롯에 연결합니다.

불행하게도 응용 프로그램은 창이 활성화되어 있고 콘솔에 quit 명령을 입력했을 때만 종료됩니다 (myObject이 항상 호출되지만 slotQuitMyObject 임). 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(); 
} 
+0

모든 연결이 성공 했습니까? 실패한 경우 런타임에 경고가 표시됩니다. – Lol4t0

+0

잘, 거기에 오타'signalQuitQApplication 대'signalQuitApplication 대, 그 상처 ... 이제 유일한 비 작동 일은 GUI에서 프로그램을 종료합니다 (이상하게도 작동, 디버거가 켜져있는 경우). – enam

+0

좋아, 나는 두 번째 버그를 알아 냈다.'getline (...) '을 호출하면 콘솔 스레드가 막혔다 ... 나는 잔인하게'스레드를 종료함으로써이 문제를 해결했다. 깨끗한 솔루션 (그래서 그 문제가 있었 http://stackoverflow.com/questions/6408584/problem-with-getline-and-threads). 이 창은 테스트 용으로 만 사용됩니다. 그래서 나는 이것이 괜찮다고 생각합니다 ... – enam

답변

-1

시도는 MyConsole 클래스에서이 코드를 사용 :

코드는 다음과 같습니다

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

또한 모든 이벤트를 닫아야합니다 & 스레드가 이전에 종료 루프.

+0

응용 프로그램 중앙 "myObject"가 먼저 모든 객체를 정리해야하므로 "qApp-> quit"을 "myConsole"에서 호출 할 수 없습니다. 어쩌면 내가 "qApp"를 멤버로 저장하면 "myObject"에서 직접 호출 할 수 있습니다 ... – enam

+0

hm ... 회원으로 qApp를 사용하는 것은 qt에서 의도하지 않은 것 같습니다 ... 어떻게 했습니까? 당신은 내 객체에 "qapp"를 알려 주려고합니까? ... QOP :: connect (myObject, SIGNAL (signalQuitQApplication()), & app, SLOT (quit()), Qt :: DirectConnection);' 같은 효과가 있어야하며 도움이되지 않습니다. – enam

+0

코드는 다음과 같습니다. class MyConsole : public QThread { Q_OBJECT protected : 가상 void run(); 신호 : void quitSignal(); }; void MyConsole :: run() { int i = 1; while (true) { std :: cin >> i; if (i == 0) { emit quitSignal(); }}} int 주 (int argc, 문자 *는 argv []) { BOOL enableWindow = 거짓; 응용 프로그램 (argc, argv, enableWindow); MyConsole * myConsole = 새 MyConsole(); QObject :: connect (myConsole, SIGNAL (quitSignal()), & app, SLOT (quit())); myConsole-> start(); 반품 앱.exec(); } –