我有一个 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())
答案 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):
# ...
请注意,多重继承的顺序非常很重要,因为 mousePressEvent
的 MousePressOverride
必须覆盖 QListWidget
的 class 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">