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
    

    总结

    官方文档还是要细品呀!

  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/parzulpan/p/13720827.html
Copyright © 2011-2022 走看看