2013-06-03 60 views
2

我正在使用PySide,并寻求一种方式来重新启动我的Qt应用程序。这取决于python,还是必须由Qt控制?什么是重新启动QApplication的正确方法?

BY ROSTYSLAV的建议贝洛:

class MyAppMainWindow(QMainWindow): 
    def __init__(self): 

     self.EXIT_CODE_REBOOT = -15123123 
     exit_code = self.EXIT_CODE_REBOOT 

    def slotReboot(self): 

     print "Performing application reboot.." 
     qApp.exit(self.EXIT_CODE_REBOOT) 

def main(): 
    currentExitCode = 0 
    app = QApplication(sys.argv) 
    ex = MyAppMainWindow() 

    while currentExitCode == ex.EXIT_CODE_REBOOT : 
     currentExitCode = app.exec_() 

     return currentExitCode 

if __name__ == '__main__': 
    main() 

很显然,我没有完全理解。请求帮助。

回答

2

Qt Wiki介绍了如何使应用程序可重新启动。 该方法基于QApplication实例的重新创建,并且不会终止当前进程。

它可以方便地采用PySide喜欢下段显示:

EXIT_CODE_REBOOT = -15123123 # you can use any unique value here 
exit_code = EXIT_CODE_REBOOT # Just for making cycle run for the first time 

while exit_code == EXIT_CODE_REBOOT: 
    exit_code = 0      # error code - no errors happened 
    app = QApplication(sys.argv) 
    ... 
    exit_code = app.exec() 

您只需通过完成您的应用程序之前QApplication presenteed的API需要设置适当的退出代码。在创建新的应用程序实例时,您可以挂接新的配置或任何您需要的配置。

+0

我编辑了带有建议代码的问题。请你看看它。 – Alex

+0

@Alex,显然,你使'return currentExitCode'成为你的应用程序在第一次迭代循环后会留下的退出代码(事件变差,它将完成'main'函数)。从while循环中移出'return ...'行。 –

1

该主题是相当古老,但我看到没有提供适当的解决方案。所以在这里(基于Rostyslav Dzinko建议的内容):

EXIT_CODE_REBOOT = -11231351 

from PySide import QtGui, QtCore 
import sys 

class MyApp(QtGui.QMainWindow): 

    def __init__(self, parent=None):  
     super(MyApp, self).__init__(parent) 
    def restart (self):    
     #DO stuff before restarting here    
     return QtCore.QCoreApplication.exit(EXIT_CODE_REBOOT)    

def start_app(): 

    exit_code = 0 
    while True: 
     try: 
      app = QtGui.QApplication(sys.argv) 
     except RuntimeError: 
      app = QtCore.QCoreApplication.instance()    
     myap = MyApp() 
     myap.show()    
     exit_code = app.exec_()    
     if exit_code != EXIT_CODE_REBOOT: 
      break   
    return exit_code 


if __name__ == '__main__': 
    start_app() 
+0

如果您添加了一个按钮来调用重新启动方法,示例脚本会更好。另外,你需要在某处导入sys。 – ekhumoro

相关问题