首先,我是 PyQt 的完全新手。

我一直在尝试将一个函数链接到主窗口的关闭按钮(窗口角落的红色 x),但没有成功。现在,我的代码看起来像这样:

class Ui_MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
    def setupUi(self, MainWindow):
        #setup code goes here
    def retranslateUi(self, MainWindow):
        #re translation of the GUI code
    def closeEvent(self, event):
        print "User has clicked the red x on the main window"

在一个单独的“主”文件中,我有以下内容:
class GUIForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self,parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        #self.ui.ECUStatus_txt = MyWidget.__init__.text_list
        self.threadData()


    if __name__ == "__main__":

        app = QtGui.QApplication(sys.argv)
        myapp = GUIForm()
        myapp.show()
        ret = app.exec_()
        sys.exit(ret)

但是,当我通过命令提示符运行时,当我点击红色 x 时,我看不到打印语句。我知道我是 Qt 的新手,但我看到很多人问这个问题,而且似乎没有一个答案超出上面已经写的内容。

这些答案之一:
Answer #1
Answer #2

这两个解决方案都与我的相似,但仍然不起作用

尽管答案可能适用于该用户的特定代码,但我和我的 PyQt 同事仍然对我们的推理不起作用感到困惑。 PyQt 中内置的“Red X 框”是否有定义的按钮名称?我可以将它连接到另一个功能,就像连接其他按钮一样吗?

最佳答案

您不应该修改从 ui 文件生成的类。相反,您应该创建子类并修改子类。

从您的代码的外观来看,您实际上是在创建两个 QMainWindow 并且由于错误的一个而捕获了 closeEvent (大概那个是隐藏的?)。即 self.ui 是未显示的 QMainWindow ,也未添加到 GUIForm 的 UI 中。相反,您自己明确使用 Ui_MainWindow.setupUi() 方法,将小部件添加到您自己的 QMainWindow 'GUIForm`。

相反,您应该做的是将 Ui_MainWindow 类保留为从 ui 文件生成时的原样,然后将主 python 文件修改为:

class GUIForm(Ui_MainWindow):
    def __init__(self, parent=None):
        Ui_MainWindow.__init__(self, parent)
        self.threadData()

    def closeEvent(self, event):
        print "User has clicked the red x on the main window"
        event.accept()


if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    myapp = GUIForm()
    myapp.show()
    ret = app.exec_()
    sys.exit(ret)

通过这种方式,您可以扩展自动生成的 UI 文件的行为。这使得从 .ui 文件重新生成 python 文件变得容易,而无需重新添加代码(这正是为什么你不应该修改自动生成的 Python 文件的原因)

关于python - 在 PyQt 主窗口中处理关闭按钮的正确方法,(红色 "X"),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24532043/

10-12 21:49