- 老有人問如何讓Qt的應(yīng)用程序自動(dòng)重啟,稍微寫一點(diǎn),也順便理理自己的思路 2011.10.26
自動(dòng)重啟,也就是退出當(dāng)前進(jìn)程,啟動(dòng)一個(gè)新的進(jìn)程。于是,先看程序如何退出
退出
Qt程序的一般結(jié)構(gòu)如下:
int main(int argc, char** argv) { QApplication app(argc, argv); Widget w; w.show() return app.exec(); }最后一句啟動(dòng)了主線程的事件循環(huán)。而要退出程序,就是要退出這個(gè)事件循環(huán),使main函數(shù)返回。
如何退出?
正確方式:
- QCoreApplication::exit(int);
它還有一個(gè)馬甲
- QCoreApplication::quit();
對(duì)于QApplication來說,它有一個(gè)常用的屬性
quitOnLastWindowClosed
所以,當(dāng)最后一個(gè)窗口關(guān)閉時(shí),它可以自動(dòng)調(diào)用前面的exit()
而至于關(guān)閉窗口呢,我們還可以使用
- QApplication::closeAllWindows()
注:一般來說,對(duì)于多個(gè)窗口的程序,調(diào)用這個(gè)會(huì)比直接調(diào)用quit要好。因?yàn)檫@樣窗口可以接受到Close事件。
啟動(dòng)外部程序
在Qt中,做這個(gè)工作的非QProcess莫屬了,要啟動(dòng)當(dāng)前程序的另一個(gè)進(jìn)程,有要使二者沒有"父子"關(guān)系。恩
QProcess::startDetached(qApp->applicationFilePath(), QStringList());
可是,為什么不寫成下面這樣?
QProcess::startDetached(qApp->applicationFilePath());
當(dāng)然,如果路徑中不包含空格,這個(gè)也可以工作。
重新啟動(dòng)1
現(xiàn)在簡單了,要重新啟動(dòng),只需要調(diào)用
void XXX::onXXX() { qApp->quit(); QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }或者:
void XXX::onXXX() { qApp->closeAllWindow(); QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }重新啟動(dòng)2
盡管沒什么好處,但有時(shí)候,我似乎更喜歡這樣寫:
void XXX::onXXX() { qApp->exit(773) }然后main函數(shù)改成
int main(int argc, char** argv) { .... int ret = app.exec(); if (ret == 773) { QProcess::startDetached(qApp->applicationFilePath(), QStringList()); return 0; } return ret; }這里面我用了一個(gè)魔數(shù):773,沒什么特別含義,只是因?yàn)槲矣X得
773 = 'r'+'e'+'s'+'t'+'a'+'r'+'t' ==>restart
上班了,就寫到這兒...