【Qt】实现程序重启的两种方法
Qt5/PyQt5 实现程序重启的两种方法
前言
最近在写一个开源项目,需要实现一个程序自动重启的功能。尝试了好几种方式,效果均不太理想。
一开始的实现思路是,记为思路一吧。大概就是写一些 shell 脚本,然后在需要自动重启的地方关闭当前程序,然后开一个进程执行这个 shell 脚本。
先来说一说这个关闭吧,主要的方法有:
QCoreApplication::exec()
// 进入主事件循环,并等待直到调用exit(),返回传递给值exit()。必须调用此函数来开始事件处理。主事件循环从窗口系统接收事件,并将事件分派给应用程序小部件。
QCoreApplication::exit(0);
// 告诉应用程序退出并返回代码。调用此函数后,应用程序将离开主事件循环,并从调用返回至exec()。该EXEC()函数返回返回码。如果事件循环未运行,则此功能不执行任何操作。
// 按照惯例,returnCode为0表示成功,并且任何非零值都表示错误。QApplication::exit(0);等价于它。
QCoreApplication::quit();
// 告诉应用程序退出,返回码为0(成功)。等效于调用QCoreApplication::exit(0); QApplication::quit();等价于它。
close();
// QApplicatio有个常用属性qApp->quitOnLastWindowClosed(true),当最后一个窗口关闭时自动调用前面的exit()。
QApplication::closeAllWindows();
// 关闭多个窗口,比调用quit好,因为窗口可以接受到 close 事件。
接着来说思路一:关闭之后,然后开一个进程执行这个 shell 脚本。发现旧应用没有自动关闭,并且也启动了新应用,关闭旧应用发现新应用也同时关闭。之后分析原因之后发现,因为使用的是 Python 的 multiprocessing 模块提供的一个Process类来代表一个进程,此时新旧应用两个之间是存在父子关系的,所以才会造成这种结果。
实现
走了上面的坑了后,查看官方文档可以知道,Qt 中常用的实现重启的方式有两种:
- 进程控制:即退出当前进程,再通过 QProcess 启动一个新的进程。
- 事件循环:退出应用程序,然后通过 Application 事件循环控制程序启动。
进程控制
def restart_real_live():
""" 进程控制实现自动重启
:return:
"""
qApp.quit()
# QProcess 类的作用是启动一个外部的程序并与之交互,并且没有父子关系。
p = QProcess
# applicationFilePath() 返回应用程序可执行文件的文件路径
p.startDetached(qApp.applicationFilePath())
事件循环
def restart_real_live():
""" 事件循环实现自动重启
:return:
"""
qApp->exit(1207);
# 因为 QCoreApplication::exec() 进入主事件循环,并等待直到调用exit(),返回传递给值exit(),所以可以在这上面动一下
if __name__=="__main__":
current_exit_code = 1207
while current_exit_code == 1207:
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
run_state_mgr()
current_exit_code = sys.exit(app.exec_())
main_window = None
总结
官方文档还是要细品呀!
【Qt】实现程序重启的两种方法的更多相关文章
- [转]Qt中定时器使用的两种方法
Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...
- qt 自动重启(两种方法)
所谓自动重启就是程序自动关闭后在重新打开: 一般一个qt程序main函数如下: int main(int argc, char* argv[]) { QApplication app(argc, ar ...
- QT 实现图片旋转的两种方法
第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...
- Qt之自定义托盘(两种方法)
http://www.cnblogs.com/swarmbees/p/5789482.html http://www.cnblogs.com/swarmbees/p/5812031.html
- Qt连接数据库的两种方法
我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...
- QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)
QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioBu ...
- QT中获取选中的radioButton的两种方法
QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast&l ...
- WPF程序将DLL嵌入到EXE的两种方法
WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...
- Qt 之 设置窗口边框的圆角(使用QSS和PaintEvent两种方法)
Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...
随机推荐
- element ui中表单循环项的校验
注意:prop是动态的
- caffe源码 全连接层
图示全连接层 如上图所示,该全链接层输入n * 4,输出为n * 2,n为batch 该层有两个参数W和B,W为系数,B为偏置项 该层的函数为F(x) = W*x + B,则W为4 * 2的矩阵,B ...
- App界面
首先我直接放图,存储记录一下,自己开发的app,后端是java分布式,
- 前端进阶之认识与手写compose方法
目录 前言:为什么要学习这个方法 compose简介 compose的实现 最容易理解的实现方式 手写javascript中reduce方法 redux中compose的实现 参考文章 最后 前言:为 ...
- mysql扩展百分位函数(类似SUM)
mysql扩展百分位函数(类似SUM) 参考:https://my.oschina.net/waterbear/blog/1186744 百度搜索:mysql percentile
- GaussDB(DWS)应用实践丨负载管理与作业排队处理方法
摘要:本文用来总结一些GaussDB(DWS)在实际应用过程中,可能出现的各种作业排队的情况,以及出现排队时,我们应该怎么去判断是否正常,调整一些参数,让资源分配与负载管理更符合当前的业务:或者在作业 ...
- MySQL主从重新同步
主从数据不一致,重新配置主从同步也是一种解决方法. 1.从库停止主从复制 stop slave; 2.对主库数据库加锁 flush tables with read lock; 3.备份主库数据 my ...
- Linux课程知识点总结(一)
Linux课程知识点总结(一) 一.Linux系统的简介 1.1 什么是Linux Linux是一个免费的多用户.多任务的操作系统,其运行方式.功能和Unix系统很相似,但Linux系统的稳定性.安全 ...
- Nebula Graph 在微众银行数据治理业务的实践
本文为微众银行大数据平台:周可在 nMeetup 深圳场的演讲这里文字稿,演讲视频参见:B站 自我介绍下,我是微众银行大数据平台的工程师:周可,今天给大家分享一下 Nebula Graph 在微众银行 ...
- 如何使用Pytest进行自动化测试
为什么需要自动化测试 自动化测试有很多优点,但这里有3个主要的点 可重用性:不需要总是编写新的脚本,除非必要,即使是新的操作系统版本也不需要编写脚本. 可靠性:人容易出错,机器不太可能.当运行不能跳过 ...