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】实现程序重启的两种方法的更多相关文章

  1. [转]Qt中定时器使用的两种方法

    Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...

  2. qt 自动重启(两种方法)

    所谓自动重启就是程序自动关闭后在重新打开: 一般一个qt程序main函数如下: int main(int argc, char* argv[]) { QApplication app(argc, ar ...

  3. QT 实现图片旋转的两种方法

    第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...

  4. Qt之自定义托盘(两种方法)

    http://www.cnblogs.com/swarmbees/p/5789482.html http://www.cnblogs.com/swarmbees/p/5812031.html

  5. Qt连接数据库的两种方法

    我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...

  6. QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

    QT中获取选中的radioButton的两种方法   QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioBu ...

  7. QT中获取选中的radioButton的两种方法

    QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast&l ...

  8. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  9. Qt 之 设置窗口边框的圆角(使用QSS和PaintEvent两种方法)

    Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...

随机推荐

  1. Vue 的父组件和子组件生命周期钩子执行顺序是什么

    加载渲染过程父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-&g ...

  2. 题解-Sakuya's task

    题面 Sakuya's task \[\left(\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\right)\bmod 10^9+7 \] 数据范围:\(1\ ...

  3. Linux 批量创建user和批量删除用户

    Linux 批量创建user和批量删除用户 以下为批量创建用户: #首先我们需要创建一个xxx.txt文件,把需要的我们创建的用户写在这个文本里面来,注意:每写完一个用户都需要换行. vim user ...

  4. Vue--子组件相互传参

    引用了element做按钮组件 父组件 创建子组件公用的空vue变量,为pubVue,并传给需要互相传参/互相调用方法的两个子组件 <template> <div> <b ...

  5. STL——容器(Set & multiset)的大小

    1. set.size();  //返回容器中元素的数目 2. set.empty();//判断容器是否为空 empty() 是由一下代码实现的,可以发现,当长度为0时返回 false,以此判断容器为 ...

  6. C++ 虚函数表与多态 —— 虚函数表的内存布局

       C++面试经常会被问的问题就是多态原理.如果对C++面向对象本质理解不是特别好,问到这里就会崩. 下面从基本到原理,详细说说多态的实现:虚函数 & 虚函数表.   1. 多态的本质: 形 ...

  7. ThreadX——IPC应用之信号量

    一.应用简介 在RTOS的应用开发中,信号量也是经常使用到的一种用于多任务之间信息同步.资源互斥访问的一种手段,常用于协调多个任务访问同一资源的场景.信号量又分为计数信号量和互斥信号量.计数信号量可以 ...

  8. Python分析世界幸福指数

    前言 民意测验机构盖洛普从2012年起,每年都会在联合国计划下发布<世界幸福指数报告>,报告会综合两年内150多个国家的国民对其所处社会.城市和自然环境等因素进行评价后,再根据他们所感知的 ...

  9. Hive JDBC执行load时无法从本地加载数据

    通过hive-jdcv连接hive server,在应用服务端执行以下命令,报错:Hiver Server节点上找不到data.txt load data local inpath '/home/dw ...

  10. css 05-CSS样式表的继承性和层叠性

    05-CSS样式表的继承性和层叠性 #本文重点 CSS的继承性 CSS的层叠性 计算权重 权重问题大总结 CSS样式表的冲突的总结 权重问题深入 同一个标签,携带了多个类名 !important标记 ...