QT实现应用程序重启
示例程序
代码上传至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实现应用程序重启相关推荐
- QT中出现程序异常结束,The process was ended forcefully的解决方案
QT中出现程序异常结束,The process was ended forcefully的解决方案 我QT连接一个数据库想进行登录成功失败的弹窗显示,已经qDebug()演示过链接的正确性,于是想用更 ...
- QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法
QT编译发布程序后报错如缺少dll."应用程序无法正常启动(0xc000007b)"的可能解决方法 参考文章: (1)QT编译发布程序后报错如缺少dll."应用程序无法正 ...
- Qt编写OpenMP程序--循环测试
第一篇:https://blog.csdn.net/hats8888/article/details/46378281 最近一个客户需要处理大量股票数据,并跑到数据库里,原来的程序导入数据到数据库需要 ...
- 【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 编辑 Qt 桌面按钮控件 | 修改按钮文本 | 为按钮添加点击事件 | 系统调用 | 去掉系统调用命令窗口 )
文章目录 一.添加按钮控件 二.修改按钮文本 三.为按钮添加点击事件 ( 弹出对话框 ) 四.为按钮添加点击事件 ( 打开记事本 ) 五.为按钮添加点击事件 ( 打开计算器 ) 六.去掉系统调用时弹出 ...
- qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...
本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...
- Qt中应用程序的打包与发布
文章目录 1 Qt中应用程序的打包与发布 1.1 调试与发布 1.2 程序的库依赖 1.3 部署程序的开发 1 Qt中应用程序的打包与发布 1.1 调试与发布 发布应用程序时的候选者: 调试版(deb ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...
- 在Qt中用默认程序打开文件
用法: QProcess::execute("explorer 文件名"); 例: QProcess::execute("explorer c:\\1 ...
- 基于VTK与Qt的体绘制程序
基于VTK与Qt的体绘制程序 分类: VTK Qt Volume Rendering C&C++ 2013-06-10 09:17 3434人阅读 评论(13) 收藏 举报 目录(?)[+] ...
最新文章
- 【lidar】基于YOLO的3D目标检测(激光雷达点云)课程设计
- 星光不问赶路人——任正非
- 聊聊我的高效学习法,让你快速拿下算法、MySQL…每天只花半小时
- [GCC for C]编译选项---IDE掩盖下的天空
- 做一个中国式站长必须知道的五十个问题
- 真传x深度学习第一课:环境配置搭建
- 年度重磅!2020年度中国计算机视觉人才调研报告正式发布
- vs code html插件_VS插件CodeRush全新发布v20.1.7|支持HTML
- 领域驱动设计营销系统建模
- Android apk包生成二维码给他人体验
- Linux增加硬盘详细教程,Linux 添加新硬盘
- 测试歌词的软件,测试、修改LRC歌词工具
- 最近做到的一些有意思的数学题目(博弈,双人玩游戏)
- 1对多业务,数据库水平切分架构一次搞定 | 架构师之路
- 学术必备!35个国内外社会科学数据网站资源汇总(附链接)
- 【Doxygen使用教程】
- 【云原生】promehtheus整合grafana实现可视化监控实战
- 计算机二级c语言应该使用什么软件进行编译
- GSM蜂窝移动通信系统 --- 时间色散和均衡
- NB-IoT天线同轴电缆RG316、RG174、RG178
热门文章
- 【转】“文盲”司机的爆笑用车傻事 你干过没?
- Vue路由守卫实现无登录只跳转到登录页面
- 微信分享官方第三方接入(图片及文字)
- 【MySQL系列】单机热备(主从结构)和双机热备介绍和使用
- 常见的网络接口解释(E1、FE、GE、10GE、POTS)
- 嵌入式linux rootfs,【转】制作 嵌入式 linux 根文件系统 rootfs
- 用Python实现自动刷王者荣耀金币,这简直不要太爽了
- 素质拓展·【团建宝】千岛湖皮划艇+露营+环岛骑行2日团建-【携程旅游】
- 蓝桥杯C/C++省赛:振兴中华
- PAT 乙级 1075