重启应用程序是一种常见的操作,在Qt中实现非常简单,需要用到QProcess类一个静态方法:
1 // program, 要启动的程序名称
2 // arguments, 启动参数
3 bool startDetached(const QString &program, const QStringList &arguments);
下面通过一个示例来演示:
【创建一个窗口】
接下来实现点击【Restart】按钮实现程序重启的功能。
// dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
// define a retcode: 773 = 'r'+'e'+'s'+'t'+'a'+'r'+'t' = restart
static const int RETCODE_RESTART = 773;
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private slots:
void on_pushButton_clicked();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
// dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->pushButton->setStyleSheet("color:black");
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
qApp->exit(RETCODE_RESTART);
}
在main函数中判断退出码是否为“RETCODE_RESTART”,来决定是否重启。
// main.cpp
#include "dialog.h"
#include <QApplication>
#include <QProcess>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
//return a.exec();
int e = a.exec();
if(e == RETCODE_RESTART)
{
// 传入 qApp->applicationFilePath(),启动自己
QProcess::startDetached(qApp->applicationFilePath(), QStringList());
return 0;
}
return e;
}
【举一反三】 按照这个思路,也可以实现Qt应用程序的自升级。不过一般自升级至少需要两个exe,避免文件占用问题。 例如: app.exe 和 update.exe,app如需升级,可以在退出时启动update.exe;update.exe 下载并更新应用程序后,启动app.exe