使用 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)