示例程序


代码上传至https://github.com/gatieme/AderXCoding/tree/master/qt/restart

问题描述


有时候写的程序在运行中有时候出现问题,期望能够通过重启来解决,但是在我们的Qt中并没有内置实现这样功能的接口,这就不得不需要自己实现。

重启,无非就是关闭当前应用程序,然后再启动一个新的进程执行当前应用程序

实现重启的方法


目前常用的有两种方式实现重启

方法 描述
进程控制 退出当前进程,再通过QProcess启动一个新的进程
事件循环 退出应用程序,然后通过Application事件循环控制程序启动

使用进程控制实现重启


首先来看qt程序如何退出

Qt程序退出

Qt程序的一般结构如下:

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

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

因此退出应用程序就需要退出应用程序QApplication

exit && quit

退出的方法简单来说有两种,我们分别来说
一般来说,正确的退出方式如下

QCoreApplication::exit(int);

还有另外一个马甲

QCoreApplication::quit(); <==> exit(0);

我们可以很容易在官方的帮助文档中,找到quit和exit之间的区别和联系

closeAllWindows

对于QApplication来说,它有一个常用的属性quitOnLastWindowClosed 默认是true,所以,当最后一个窗口关闭时,它可以自动调用前面的exit()

因此关闭程序我们只需要关闭所有程序,并且保证quitOnLastWindowClosed = true即可.

因此我们还可以使用

QApplication::closeAllWindows()

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

重新启动一个进程


在Qt中, 可以使用QProcess::startDetached开启一个新的进程
要启动当前程序的另一个进程,有要使二者没有”父子”关系就可以使用QProcess

QProcess类的作用是启动一个外部的程序并与之交互。

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

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

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

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

通过进程控制实现重启


///  使用进程控制实现重启
/// 执行如下操作
/// ①  退出当前程序  (QT下有6种方式实现)
/// ②  开启新的进程启动当前程序  (使用QProcess::startDetached)
///
/// ①  种方式实现退出
///
//  方式一: QCoreApplication::exit(0);0是状态还可以是其他的值。
//         QCoreApplication::quit();
//         QApplication::exit(0);
//         QApplication是继承QCoreApplication的。
//         QApplication::quit();
//  方式二: close();QApplicatio有个常用属性qApp->quitOnLastWindowClosed(true);当最后一个窗口关闭时自动调用前面的exit()。
//         QApplication::closeAllWindows();关闭多个窗口,比调用quit好,因为窗口可以接受到close事件。
///
/// ②  开启新的进程启动当前程序
///
//  在Qt中, 可以使用QProcess::startDetached开启一个新的进程
//  要启动当前程序的另一个进程,有要使二者没有"父子"关系
//  使用QProcess::startDetached(qApp->applicationFilePath(), QStringList());
//  其中QStringList()为参数列表
//  特别的, 如果程序的路径中没有空格也可以使用QProcess::startDetached(qApp->applicationFilePath());
void RestartWidget::slotProceeRestart()
{qApp->closeAllWindows();//qApp->quit();//  如果是在嵌入式arm板子上,需要加入 -qws 的参数//QStringList args;//args.append("-qws");        //  参数信息//args.append("&");           //  后台运行QProcess::startDetached(qApp->applicationFilePath(), QStringList());
}

使用事件循环


自己观察前面的qt主函数,我们看到最后一行a.exec();

这个函数使qt的gui进入了事件循环,并且返回了程序exit的值,
因此我们可以在这个地方做些手脚。

最简单的办法,就是创建一个循环,当函数正常退出时,不做处理,而程序期望程序时,返回一个我们可以识别的EXIT_CODE,并且不真正退出,而是重新启动一个新的窗体进入事件循环
尽管没什么好处,但有时候,我似乎更喜欢这样写:

///  使用事件循环进行重启
void RestartWidget::soltExitRestart()
{//  773 = 'r'+'e'+'s'+'t'+'a'+'r'+'t'//  ==>restart//#define EXIT_RESTART  773qApp->exit(773);}

然后main函数改成

int main(int argc, char *argv[])
{QApplication a(argc, argv);int ret = -1;do{RestartWidget w;w.show();ret = a.exec();}while(ret != 0);return ret;
}

QT实现应用程序重启相关推荐

  1. QT中出现程序异常结束,The process was ended forcefully的解决方案

    QT中出现程序异常结束,The process was ended forcefully的解决方案 我QT连接一个数据库想进行登录成功失败的弹窗显示,已经qDebug()演示过链接的正确性,于是想用更 ...

  2. QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法

    QT编译发布程序后报错如缺少dll."应用程序无法正常启动(0xc000007b)"的可能解决方法 参考文章: (1)QT编译发布程序后报错如缺少dll."应用程序无法正 ...

  3. Qt编写OpenMP程序--循环测试

    第一篇:https://blog.csdn.net/hats8888/article/details/46378281 最近一个客户需要处理大量股票数据,并跑到数据库里,原来的程序导入数据到数据库需要 ...

  4. 【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 编辑 Qt 桌面按钮控件 | 修改按钮文本 | 为按钮添加点击事件 | 系统调用 | 去掉系统调用命令窗口 )

    文章目录 一.添加按钮控件 二.修改按钮文本 三.为按钮添加点击事件 ( 弹出对话框 ) 四.为按钮添加点击事件 ( 打开记事本 ) 五.为按钮添加点击事件 ( 打开计算器 ) 六.去掉系统调用时弹出 ...

  5. qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...

    本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...

  6. Qt中应用程序的打包与发布

    文章目录 1 Qt中应用程序的打包与发布 1.1 调试与发布 1.2 程序的库依赖 1.3 部署程序的开发 1 Qt中应用程序的打包与发布 1.1 调试与发布 发布应用程序时的候选者: 调试版(deb ...

  7. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...

  8. 在Qt中用默认程序打开文件

    用法:    QProcess::execute("explorer 文件名"); 例:        QProcess::execute("explorer c:\\1 ...

  9. 基于VTK与Qt的体绘制程序

    基于VTK与Qt的体绘制程序 分类: VTK Qt Volume Rendering C&C++ 2013-06-10 09:17 3434人阅读 评论(13) 收藏 举报 目录(?)[+] ...

最新文章

  1. 【lidar】基于YOLO的3D目标检测(激光雷达点云)课程设计
  2. 星光不问赶路人——任正非
  3. 聊聊我的高效学习法,让你快速拿下算法、MySQL…每天只花半小时
  4. [GCC for C]编译选项---IDE掩盖下的天空
  5. 做一个中国式站长必须知道的五十个问题
  6. 真传x深度学习第一课:环境配置搭建
  7. 年度重磅!2020年度中国计算机视觉人才调研报告正式发布
  8. vs code html插件_VS插件CodeRush全新发布v20.1.7|支持HTML
  9. 领域驱动设计营销系统建模
  10. Android apk包生成二维码给他人体验
  11. Linux增加硬盘详细教程,Linux 添加新硬盘
  12. 测试歌词的软件,测试、修改LRC歌词工具
  13. 最近做到的一些有意思的数学题目(博弈,双人玩游戏)
  14. 1对多业务,数据库水平切分架构一次搞定 | 架构师之路
  15. 学术必备!35个国内外社会科学数据网站资源汇总(附链接)
  16. 【Doxygen使用教程】
  17. 【云原生】promehtheus整合grafana实现可视化监控实战
  18. 计算机二级c语言应该使用什么软件进行编译
  19. GSM蜂窝移动通信系统 --- 时间色散和均衡
  20. NB-IoT天线同轴电缆RG316、RG174、RG178

热门文章

  1. 【转】“文盲”司机的爆笑用车傻事 你干过没?
  2. Vue路由守卫实现无登录只跳转到登录页面
  3. 微信分享官方第三方接入(图片及文字)
  4. 【MySQL系列】单机热备(主从结构)和双机热备介绍和使用
  5. 常见的网络接口解释(E1、FE、GE、10GE、POTS)
  6. 嵌入式linux rootfs,【转】制作 嵌入式 linux 根文件系统 rootfs
  7. 用Python实现自动刷王者荣耀金币,这简直不要太爽了
  8. 素质拓展·【团建宝】千岛湖皮划艇+露营+环岛骑行2日团建-【携程旅游】
  9. 蓝桥杯C/C++省赛:振兴中华
  10. PAT 乙级 1075