Właściwy sposób na zamknięcie programu Qt?


133

Jak zamknąć program Qt, np. Podczas ładowania pliku danych, i wykryto uszkodzenie pliku, a użytkownik musi zamknąć tę aplikację lub ponownie zainicjować plik danych?

Czy powinienem:

  1. połączenie exit(EXIT_FAILURE)
  2. połączenie QApplication::quit()
  3. połączenie QCoreApplication::quit()

A różnica między (2) a (3)?

Odpowiedzi:


148

QApplication wywodzi się z QCoreApplication i tym samym dziedziczy quit()publiczną sekcję QCoreApplication, więc nie ma różnicy między QApplication::quit()i QCoreApplication::quit().

Jak możemy przeczytać w dokumentacji QCoreApplication::quit(), „mówi aplikacji, aby zakończyła pracę z kodem powrotu 0 (powodzenie)”. . Jeśli chcesz zakończyć, ponieważ QCoreApplication::exit()odkryłeś uszkodzenie pliku, możesz nie chcieć kończyć z kodem powrotu zero, co oznacza sukces, więc powinieneś wywołać, ponieważ możesz podać niezerowy kod returnCode, który zgodnie z konwencją wskazuje na błąd.

Należy zauważyć, że „jeśli pętla zdarzeń nie jest uruchomiona, ta funkcja (QCoreApplication :: exit ()) nic nie robi” , więc w takim przypadku należy wywołać exit(EXIT_FAILURE).


31

Możesz zadzwonić qApp.exit();. Zawsze tego używam i nigdy nie miałem z tym problemu.

Jeśli twoja aplikacja jest aplikacją wiersza poleceń, możesz rzeczywiście chcieć zwrócić kod zakończenia. To całkowicie zależy od Ciebie, jaki jest kod.


4
Musiałem wykonać następujące czynności:qApp->exit();
Frederick Ollinger


-2

jeśli chcesz zamknąć aplikację z main (), możesz użyć tego kodu

int main(int argc, char *argv[]){
QApplication app(argc, argv);
...
if(!QSslSocket::supportsSsl()) return app.exit(0);
...
return app.exec();
}

Program zostanie zakończony, jeśli OpenSSL nie zostanie zainstalowany


1
Myślę, że to się nie kompiluje. app.exit (0) nie zwraca int. Użyj if(!QSslSocket::supportsSsl()) {return 0;};. Ponieważ app.exec () nie została wywołana w tym wierszu, app.exit (0) nic nie robi, zobacz dokumentację QCoreApplication :: exit (): Jeśli pętla zdarzeń nie jest uruchomiona, ta funkcja nic nie robi.
Sacha Guyer

-7
//How to Run App

bool ok = QProcess::startDetached("C:\\TTEC\\CozxyLogger\\CozxyLogger.exe");
qDebug() <<  "Run = " << ok;


//How to Kill App

system("taskkill /im CozxyLogger.exe /f");
qDebug() << "Close";

przykład


1
nie chodzi o odłączanie nowych procesów
początkujący koder

1
Dodaj wyjaśnienie do swojej odpowiedzi, aby inni mogli się z niej nauczyć
Nico Haase
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.