Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371900
  • 博文数量: 50
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 641
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-09 22:35
个人简介

不怕你失败,就怕你爬不起来。

文章分类

全部博文(50)

文章存档

2014年(50)

我的朋友

分类: 嵌入式

2014-09-21 04:21:56

老有人问如何让Qt的应用程序自动重启,稍微写一点,也顺便理理自己的思路 2011.10.26

自动重启,也就是退出当前进程,启动一个新的进程。于是,先看程序如何退出

退出

Qt程序的一般结构如下:

int main(int argc, char** argv) {  QApplication app(argc, argv);  Widget w;  w.show()  return app.exec(); }

最后一句启动了主线程的事件循环。而要退出程序,就是要退出这个事件循环,使main函数返回。

如何退出?

正确方式:

  • QCoreApplication::exit(int);

它还有一个马甲

  • QCoreApplication::quit();

对于QApplication来说,它有一个常用的属性

quitOnLastWindowClosed

所以,当最后一个窗口关闭时,它可以自动调用前面的exit()

而至于关闭窗口呢,我们还可以使用

  • QApplication::closeAllWindows()

注:一般来说,对于多个窗口的程序,调用这个会比直接调用quit要好。因为这样窗口可以接受到Close事件。

启动外部程序

在Qt中,做这个工作的非QProcess莫属了,要启动当前程序的另一个进程,有要使二者没有"父子"关系。恩

QProcess::startDetached(qApp->applicationFilePath(), QStringList());

可是,为什么不写成下面这样?

QProcess::startDetached(qApp->applicationFilePath());

当然,如果路径中不包含空格,这个也可以工作。

重新启动1

现在简单了,要重新启动,只需要调用

void XXX::onXXX() {  qApp->quit();  QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }

或者:

void XXX::onXXX() {  qApp->closeAllWindow();  QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }

重新启动2

尽管没什么好处,但有时候,我似乎更喜欢这样写:

void XXX::onXXX() {  qApp->exit(773) }

然后main函数改成

int main(int argc, char** argv) { ....  int ret = app.exec();  if (ret == 773) {  QProcess::startDetached(qApp->applicationFilePath(), QStringList());  return 0;  }  return ret; }

这里面我用了一个魔数:773,没什么特别含义,只是因为我觉得

773 = 'r'+'e'+'s'+'t'+'a'+'r'+'t' ==>restart

上班了,就写到这儿...

阅读(2417) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~