如何重启PyQt4应用程序

1 投票
4 回答
5358 浏览
提问于 2025-04-17 17:58

有没有办法重新启动PyQt应用程序的QApplication

我有一个用pyqt4和python 2.6创建的应用程序,代码如下:

app = QtGui.QApplication(sys.argv)

我有一些设置选项,可以在这里调整一些设置。现在,当我保存设置时,我需要重新加载应用程序,以便新设置能够生效。希望用户不需要手动退出再重新启动应用程序。

4 个回答

0

编辑:更改获取应用程序路径的方法

你可以简单地启动一个新进程,然后退出当前的进程,像这样做:(代码没有经过测试,但基于 这个回答

// Restart Application
def restart(self, abort):
    // Spawn a new instance of myApplication:
    proc = QProcess()
    //proc.start(self.applicationFilePath());
    import os
    proc.start(os.path.abspath(__file__))

    self.exit(0);

把它写成你Qapplication的一个方法,或者如果你不想创建子类,也可以写成一个函数。

2

我来解释一下我是怎么做到的:

我创建了一个额外的文件 main.py,这个文件会调用我真正的主程序文件 dash.py。然后我发出了一个重启的信号(因为我的程序在关闭事件时会自动更新),所以我需要发出这个信号。以下是一些代码片段,希望能对你有所帮助。

这段代码是在我的主程序文件 dash.py 中:

def restart(self):
    # create a signal equivalent to "void someSignal(int, QWidget)"
    self.emit(QtCore.SIGNAL("RESTARTREQUIRED"), True)

这段代码在 main.py 中,它只调用真正的程序并重启应用。

import sys
from PyQt4 import QtGui,QtCore
from bin import dash

if __name__ == "__main__":
    application = QtGui.QApplication(sys.argv)
    uDesk = dash.app()
    uDesk.show()
    uDesk.actionRestart.triggered.disconnect()
    # define restart slot
    @QtCore.pyqtSlot()
    def restartSlot():
        print 'Restarting app'
        global uDesk
        uDesk.deleteLater()
        uDesk = dash.app()
        uDesk.show()
        uDesk.actionRestart.triggered.disconnect()   
        uDesk.actionRestart.triggered.connect(restartSlot)
        print 'New app started !'

    QtCore.QObject.connect(uDesk,
                   QtCore.SIGNAL("RESTARTREQUIRED"),
                   restartSlot)
    uDesk.actionRestart.triggered.connect(restartSlot)
    sys.exit(application.exec_()) 

希望这对你有帮助!!

3

我遇到过类似的问题,所以在合适的地方用了这个:

subprocess.Popen([__file__])
sys.exit(0)

这个应用程序很简单,不需要其他的参数。

撰写回答