Pyside uiLoader 捕获关闭事件信号
Pyside uiLoader capture close event signals
如何正确捕获来自 PySide QtUiTools.QUiLoader() 设置的关闭事件?
我可以获得实例化 class 以连接到小部件和其他所有内容,但我不确定如何拦截此设置中的信号。
理想情况下,我希望所有关闭调用都通过我的 closeEvent(显然),这样我就可以确保关闭 window 是安全的。但是由于我的 self.closeEvent() 绑定到我的视图 (QtWidgets.QMainWindow) 而不是 self._qt.closeEvent(),我不知道如何到达 self._qt.closeEvent()在这种情况下覆盖它的方法。
或者是否有更好的方法来设置它以捕获那些 window 事件?
# Compatible enough with Pyside 2
from PySide import QtGui as QtWidgets
from PySide import QtUiTools
from PySide import QtCore
class View(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(View, self).__init__(parent=parent)
self.setup()
def closeEvent(self, event):
# Do things
event.accept()
def setup(self):
loader = QtUiTools.QUiLoader()
fy = QtCore.QFile('example.ui')
fy.open(QtCore.QFile.ReadOnly)
self._qt = loader.load(fy, self)
fy.close()
self._qt.pCanceled.clicked(self._qt.close)
不适用:
PySide / PyQt detect if user trying to close window
关闭,但 PySide 不使用 PyQt 的 uic 并且看起来 运行 不同(并且没有工作):
PyQt: clicking X doesn't trigger closeEvent
closeEvent
不是一个信号,它是发送QCloseEvent
事件时调用的方法。信号和事件是不同的东西。解决这个问题,在 Qt 中有两种监听事件的方法,第一种是覆盖 fooEvent()
方法,第二种是使用事件过滤器,如下所示:
from PySide import QtGui as QtWidgets
from PySide import QtUiTools
from PySide import QtCore
class View(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(View, self).__init__(parent=parent)
self._qt = None
self.setup()
def closeEvent(self, event):
self.do_things()
super(View, self).closeEvent(event)
def do_things(self):
print("do_things")
def setup(self):
loader = QtUiTools.QUiLoader()
fy = QtCore.QFile('example.ui')
fy.open(QtCore.QFile.ReadOnly)
self._qt = loader.load(fy, self)
fy.close()
self._qt.pCanceled.clicked.connect(self._qt.close)
self._qt.installEventFilter(self)
def eventFilter(self, watched, event):
if watched is self._qt and event.type() == QtCore.QEvent.Close:
self.do_things()
return super(View, self).eventFilter(watched, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = View()
w.show()
sys.exit(app.exec_())
更新:
通常在 eventFilter
中,return True 足以忽略事件,但在 QCloseEvent
的情况下,您必须忽略事件,并且 return真实如下图:
def eventFilter(self, watched, event):
if watched is self._qt and event.type() == QtCore.QEvent.Close:
self.do_things()
event.ignore()
return True
return super(View, self).eventFilter(watched, event)
如何正确捕获来自 PySide QtUiTools.QUiLoader() 设置的关闭事件?
我可以获得实例化 class 以连接到小部件和其他所有内容,但我不确定如何拦截此设置中的信号。
理想情况下,我希望所有关闭调用都通过我的 closeEvent(显然),这样我就可以确保关闭 window 是安全的。但是由于我的 self.closeEvent() 绑定到我的视图 (QtWidgets.QMainWindow) 而不是 self._qt.closeEvent(),我不知道如何到达 self._qt.closeEvent()在这种情况下覆盖它的方法。
或者是否有更好的方法来设置它以捕获那些 window 事件?
# Compatible enough with Pyside 2
from PySide import QtGui as QtWidgets
from PySide import QtUiTools
from PySide import QtCore
class View(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(View, self).__init__(parent=parent)
self.setup()
def closeEvent(self, event):
# Do things
event.accept()
def setup(self):
loader = QtUiTools.QUiLoader()
fy = QtCore.QFile('example.ui')
fy.open(QtCore.QFile.ReadOnly)
self._qt = loader.load(fy, self)
fy.close()
self._qt.pCanceled.clicked(self._qt.close)
不适用:
PySide / PyQt detect if user trying to close window
关闭,但 PySide 不使用 PyQt 的 uic 并且看起来 运行 不同(并且没有工作):
PyQt: clicking X doesn't trigger closeEvent
closeEvent
不是一个信号,它是发送QCloseEvent
事件时调用的方法。信号和事件是不同的东西。解决这个问题,在 Qt 中有两种监听事件的方法,第一种是覆盖 fooEvent()
方法,第二种是使用事件过滤器,如下所示:
from PySide import QtGui as QtWidgets
from PySide import QtUiTools
from PySide import QtCore
class View(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(View, self).__init__(parent=parent)
self._qt = None
self.setup()
def closeEvent(self, event):
self.do_things()
super(View, self).closeEvent(event)
def do_things(self):
print("do_things")
def setup(self):
loader = QtUiTools.QUiLoader()
fy = QtCore.QFile('example.ui')
fy.open(QtCore.QFile.ReadOnly)
self._qt = loader.load(fy, self)
fy.close()
self._qt.pCanceled.clicked.connect(self._qt.close)
self._qt.installEventFilter(self)
def eventFilter(self, watched, event):
if watched is self._qt and event.type() == QtCore.QEvent.Close:
self.do_things()
return super(View, self).eventFilter(watched, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = View()
w.show()
sys.exit(app.exec_())
更新:
通常在 eventFilter
中,return True 足以忽略事件,但在 QCloseEvent
的情况下,您必须忽略事件,并且 return真实如下图:
def eventFilter(self, watched, event):
if watched is self._qt and event.type() == QtCore.QEvent.Close:
self.do_things()
event.ignore()
return True
return super(View, self).eventFilter(watched, event)