如何覆盖 closeEvent 函数以使其正常工作
Posted
技术标签:
【中文标题】如何覆盖 closeEvent 函数以使其正常工作【英文标题】:How to do override closeEvent functions to make it working 【发布时间】:2021-04-03 15:00:49 【问题描述】:我正在使用 pyside2 和 pyqt5 库来加载我的 UI 文件。
from PySide2 import QtWidgets
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
class A(QtWidgets.QWidget):
def __init__(self, parent=None):
super(A, self).__init__(parent)
self.ui = QUiLoader().load('uiFile.ui')
def closeEvent(self, event):
event.ignore()
app = QApplication([])
mainWin = A()
mainWin.ui.show()
app.exec_()
在我看来,当我单击 X 按钮时它会显示“11111”。 但是,它根本不起作用。
here is the ui file
【问题讨论】:
您可以在使用operation_ui
类的地方添加代码吗?
您能否更新您的问题以包含最少的可重现代码?如果它没有运行,似乎有点难以猜测出了什么问题。
这些怎么样?
好多了,但是“uiFile.ui”的内容会有很大帮助。
你的代码中真的是print(11111111)
吗?因为那是试图打印一个名为 11111111
的变量的值,而不是文字文本。应该是print('11111111')
。
【参考方案1】:
问题是“A”是一个不显示的小部件,它不是窗口,所以覆盖closeEvent没有意义。相反,您应该使用事件过滤器来监视窗口的事件。
from PySide2.QtCore import QEvent, QObject
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
class Manager(QObject):
def __init__(self, ui, parent=None):
super(Manager, self).__init__(parent)
self._ui = ui
self.ui.installEventFilter(self)
@property
def ui(self):
return self._ui
def eventFilter(self, obj, event):
if obj is self.ui:
if event.type() == QEvent.Close:
event.ignore()
return True
super().eventFilter(obj, event)
def main():
app = QApplication([])
manager = Manager(QUiLoader().load("uiFile.ui"))
manager.ui.show()
app.exec_()
if __name__ == "__main__":
main()
如果你想覆盖 .ui 中使用的 QMainWindow 的 closeEvent 方法,那么你必须提升它并将其注册为this other answer 显示。
【讨论】:
以上是关于如何覆盖 closeEvent 函数以使其正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Vue 3 Typescript 如何正确比较字符串以使其正常工作?
如何将 React 组件分离到不同的文件中以使其正常工作并避免 TypeErrors?
我应该如何覆盖 VideoView 的 onDraw 以使其具有透明的圆角?