重启主要有两种方式退出码重启和QProcess重启。
- 退出码重启定义退出代码
比较好的方式,在主窗口中定义一个静态变量:
static int const EXIT_CODE_REBOOT;
并进行初始化:
int const Widget::EXIT_CODE_REBOOT = -123456789;
或者可以定义一个全局变量或常量值。
主窗口.h文件定义如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
static int const EXIT_CODE_REBOOT;
public slots:
void reboot();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
cpp文件定义如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDir>
#include <QProcess>
int const MainWindow::EXIT_CODE_REBOOT = -123456789;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton *pButton = new QPushButton(this);
pButton->setText(QStringLiteral("重启"));
connect(pButton, SIGNAL(clicked(bool)), this, SLOT(reboot()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::reboot()
{
qApp->exit(MainWindow::EXIT_CODE_REBOOT);
}
main.cpp文件定义如下
#include "mainwindow.h"
#include <QApplication>
#include <QDir>
#include <QProcess>
int main(int argc, char *argv[])
{
int nExitCode = 0;
do
{
QApplication a(argc, argv);
MainWindow w;
w.show();
nExitCode = a.exec();
} while(nExitCode == MainWindow::EXIT_CODE_REBOOT);
return nExitCode;
}
效果如下:
- QProcess重启
无需要定义重启码,也无需要修改应用程序循环。只需要一个简单的槽函数即可。
定义一个槽函数,里面包含应用程序重启的代码:
void MainWindow::reboot()
{
QString program = QApplication::applicationFilePath();
QStringList arguments = QApplication::arguments();
QString workingDirectory = QDir::currentPath();
QProcess::startDetached(program, arguments, workingDirectory);
QApplication::exit();
}