使用 functools 拦截 QDialog closeEvent 需要额外的参数
Intercepting QDialog closeEvent with functools takes extra argument
我正试图像这样从 QDialog 拦截 closeEvent 。我使用 functools.partial
在一个对象中调用另一个函数。
class BrowserDialog(QtWidgets.QDialog, FORM_CLASS):
def __init__(self, parent=None):
super(BrowserDialog, self).__init__(parent)
self.setupUi(self)
class Browser:
"""QGIS Plugin Implementation."""
def __init__(self, iface):
...
def close_event(self):
pass
def run(self):
self.dlg = BrowserDialog()
self.dlg.closeEvent = functools.partial(self.close_event)
但我收到错误消息:
TypeError: close_event() takes 1 positional argument but 2 were given
我要提供什么额外的论据?
不要创建 foo_object.barEvent = some_function
,因为该方法可能会失败,因为 PyQt 有这些方法的缓存,因此您的赋值可以被忽略,另一方面,closeEvent 方法接收一个提供事件信息的参数.与其这样做,不如创建一个信号,它是在 Qt 中调用函数的最佳方式,必须发出该信号覆盖 closeEvent 方法。
class BrowserDialog(QtWidgets.QDialog, FORM_CLASS):
closed = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(BrowserDialog, self).__init__(parent)
self.setupUi(self)
def closeEvent(self, event):
super(BrowserDialog, self).closeEvent(event)
self.closed.emit()
class Browser:
"""QGIS Plugin Implementation."""
def __init__(self, iface):
...
def handle_closed(self):
print("closed")
def run(self):
self.dlg = BrowserDialog()
self.dlg.closed.connect(self.handle_closed)
我正试图像这样从 QDialog 拦截 closeEvent functools.partial
在一个对象中调用另一个函数。
class BrowserDialog(QtWidgets.QDialog, FORM_CLASS):
def __init__(self, parent=None):
super(BrowserDialog, self).__init__(parent)
self.setupUi(self)
class Browser:
"""QGIS Plugin Implementation."""
def __init__(self, iface):
...
def close_event(self):
pass
def run(self):
self.dlg = BrowserDialog()
self.dlg.closeEvent = functools.partial(self.close_event)
但我收到错误消息:
TypeError: close_event() takes 1 positional argument but 2 were given
我要提供什么额外的论据?
不要创建 foo_object.barEvent = some_function
,因为该方法可能会失败,因为 PyQt 有这些方法的缓存,因此您的赋值可以被忽略,另一方面,closeEvent 方法接收一个提供事件信息的参数.与其这样做,不如创建一个信号,它是在 Qt 中调用函数的最佳方式,必须发出该信号覆盖 closeEvent 方法。
class BrowserDialog(QtWidgets.QDialog, FORM_CLASS):
closed = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(BrowserDialog, self).__init__(parent)
self.setupUi(self)
def closeEvent(self, event):
super(BrowserDialog, self).closeEvent(event)
self.closed.emit()
class Browser:
"""QGIS Plugin Implementation."""
def __init__(self, iface):
...
def handle_closed(self):
print("closed")
def run(self):
self.dlg = BrowserDialog()
self.dlg.closed.connect(self.handle_closed)