对 QTableWidget 和 QListWidget 使用相同的子类覆盖方法

时间:2021-08-01 20:08:12

标签: python pyside

我有一个 QTableWidget 和 QListWidget,我想用类似的覆盖方法(如 mousePressEvent())对其进行子类化。为了保持我的代码干燥,我不希望有两个具有重复逻辑的独特子类。任何人都可以建议在这种情况下使用的模式吗?

伪代码:

from PySide2 import QtWidgets, QtCore

class ChildClass(QtWidgets.QListWidget): # Could be QTableWidget
    _main_window = None
    _context_menu = None

    def __init__(self, main_window):
        super().__init__(main_window)
        self._main_window = main_window
        self.setDragEnabled(True)
        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.show_context_menu)

    def mousePressEvent(self, event):
        super().mousePressEvent(event)
        self._main_window.set_active_browser(self.parent())

1 个答案:

答案 0 :(得分:1)

您可以使用 mixin

class MousePressOverride:
    def mousePressEvent(self, event):
        super().mousePressEvent(event)
        self._main_window.set_active_browser(self.parent())


class ChildClass(MousePressOverride, QtWidgets.QListWidget):
    # ...

请注意,多重继承的顺序非常很重要,因为 mousePressEventMousePressOverride 必须覆盖 QListWidgetclass MousePressOverride: someSignal = QtCore.pyqtSignal(object) def mousePressEvent(self, event): super().mousePressEvent(event) self.someSignal.emit(self) class ChildClass(MousePressOverride, QtWidgets.QListWidget): def __init__(self): super().__init__() # ... class MainWindow(QtWidgets.QMainWindow): def __init__(self): # ... self.view = ChildClass() self.view.someSignal.connect(self.set_active_browser) def set_active_browser(self, obj): # ...

请考虑,如果您想与父对象交互/通信,您应该考虑改用信号,因为这样会更好地符合 OOP 模式:

<input type="range" min="0" step="5" max="105">