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

2024-10-01 17:27:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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())

Tags: 代码selfnoneinitmaindefcontextwindow
1条回答
网友
1楼 · 发布于 2024-10-01 17:27:53

您可以使用mixin

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


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

注意,多重继承的顺序非常重要,因为MousePressOverridemousePressEvent必须覆盖QListWidget的顺序

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

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):
        # ...

相关问题 更多 >

    热门问题