0

我编写了一个由两个独立文件组成的 python GUI 程序;一个用于逻辑代码,另一个用于使用 PyQt4 的 GUI。某些对象(按钮、文本字段...)的行为在整个代码中发生了变化,我需要通过单击 QAction 类菜单项将所有内容重置为其原始状态。我怎样才能做到这一点?

编辑:应该将 GUI 重置为原始状态的功能:

def newSession(self):
        self.ui.setupUi(self)
        self.filename = ""
        self.paramsSplitted = []
        self.timestep = None
        self.index = None
        self.selectedParam = None
        self.selectedMethod = None

        --Snip--
4

2 回答 2

0

就像您在评论中要求的那样,这里是利用函数连接所有信号的示意性方法和方法setupUi

class MainWindow(QtGui.QMainWindow) :
    def __init__(self) :
        QtGui.QMainWindow.__init__(self)
        self.ui.setupUi(self)

        # Some code

        self.connectAllSignals()

    def connectAllSignals(self) :
        self.someWidget.clicked.connect(self.someFunction)
        self.someAction.triggered.connect(self.otherFunction)

        # All the other signals

    def disconnectAllSignals(self) :
        try :
            self.someWidget.clicked.disconnect()
            self.someAction.triggered.disconnect()

            # All the other signals

        except :
            print("Something went wrong. Check your code.")
            pass

    def newSession(self) :
        self.ui.setupUi(self)
        self.disconnectAllSignals()
        self.connectAllSignals()

        # Do whatever it takes

通过这种方式,您可以确保您只有信号的初始设置,并且所有动态添加的连接都已断开。在该方法disconnectAllSignals中,请确保所有小部件都存在并且所有信号在您调用它时至少有一个连接。如果您动态调用了新的小部件,您应该考虑newSession在调用后在 th 方法中删除它们connectAllSignals

于 2017-11-14T11:00:01.233 回答
0

你可以做什么:

  • ResetHandler(QtCore.QObject)reset_everything信号定义对象
  • 在启动期间创建一个实例并将其设置为全局可用,QApplication例如qapplication.reset_handler = ResetHandler()
  • 每个需要更新自身的 UI 元素都定义了一个on_reset_everything_triggered()插槽。(可选:您也可以只使用update例如)
  • 当您创建应该更新的 UI 元素时,请将它们连接到reset_everything来自QApplication.
  • 连接你QAction.triggeredResetHandler.reset_everything信号。
  • 现在,每次您按下信号时QActionreset_everything都会调用信号,并且您连接的所有 UI 元素都会自行更新。
于 2017-11-08T11:11:03.297 回答