이상한 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();
}
모든 연결이 성공 했습니까? 실패한 경우 런타임에 경고가 표시됩니다. – Lol4t0
잘, 거기에 오타'signalQuitQApplication 대'signalQuitApplication 대, 그 상처 ... 이제 유일한 비 작동 일은 GUI에서 프로그램을 종료합니다 (이상하게도 작동, 디버거가 켜져있는 경우). – enam
좋아, 나는 두 번째 버그를 알아 냈다.'getline (...) '을 호출하면 콘솔 스레드가 막혔다 ... 나는 잔인하게'스레드를 종료함으로써이 문제를 해결했다. 깨끗한 솔루션 (그래서 그 문제가 있었 http://stackoverflow.com/questions/6408584/problem-with-getline-and-threads). 이 창은 테스트 용으로 만 사용됩니다. 그래서 나는 이것이 괜찮다고 생각합니다 ... – enam