zoukankan      html  css  js  c++  java
  • 【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
    

    总结

    官方文档还是要细品呀!

  • 相关阅读:
    安装nodejs和yarn(配置淘宝源)
    适用于 Linux 的 Windows 子系统没有已安装的分发版
    selenium定位元素click时报错
    dubbo从入门到实战(转)
    SpringBoot整合JPA简单介绍
    办公自动化路上的异化
    邮箱黑名单:如何查看邮件IP是否被列入黑名单,及如何删除
    邮箱黑名单(1):
    Vmware挂载san存储_vSphere 6.x 共享存储LUN丢失分区表修复(精华)
    AD中FSMO五大角色的介绍及操作
  • 原文地址:https://www.cnblogs.com/parzulpan/p/13720827.html
Copyright © 2011-2022 走看看