응용 프로그램이 재시작하여 새로운 구성을 로드해야하는 경우가 종종 있다. 이럴 때 QProcess
클래스를 사용하여 응용 프로그램을 재시작하는 예제이다. 윈도우의 닫기 버튼을 누르면 앱은 그냥 종료되고 "재시작" 버튼을 누르면 종료 후 다시 실행된다.
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QProcess>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
int result = a.exec();
if (EXIT_RESTART == result || EXIT_RESET == result) {
qDebug() << "restarting app";
#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC)
::qputenv("LIBGL_ALWAYS_SOFTWARE",
Settings.drawMethod() == Qt::AA_UseSoftwareOpenGL && !Settings.playerGPU()
? "1" : "0");
#endif
QProcess *restart = new QProcess;
QStringList args = a.arguments();
if (!args.isEmpty())
args.removeFirst();
restart->start(a.applicationFilePath(), args, QIODevice::NotOpen);
result = EXIT_SUCCESS;
}
return result;
}
mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_exitCode(EXIT_SUCCESS)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
if (m_exitCode == EXIT_SUCCESS) {
QApplication::quit();
qDebug() << "end";
::_Exit(0);
} else {
QApplication::exit(m_exitCode);
qDebug() << "end";
}
}
// Restart Application
void MainWindow::on_pushButton_clicked(bool checked)
{
m_exitCode = EXIT_RESTART;
QApplication::closeAllWindows();
}