首先,我是 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/