首页 > 解决方案 > 子类化小部件以覆盖方法,同时保留原始方法功能

问题描述

我想使用CTRL+C从 QTableWidget 复制数据。为此,我对 QTableWidget 进行了子类化并覆盖了 keyPressEvent() 方法,该方法效果很好。但是,这会丢失有用的 keyPressEvent() 功能,例如使用方向键滚动表格。

有没有办法让原始方法固有地实现一些额外的功能?

class SubQTableWidget(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        QtWidgets.QTableWidget.__init__(self, parent)

    def keyPressEvent(self, event):
        # inheret original keyPressEvent() functionality?
        if (event.type() == QtCore.QEvent.KeyPress and
                event.matches(QtGui.QKeySequence.Copy)):
            self.copy_selection()

标签: pythonpyqtpyqt5qtablewidget

解决方案


要覆盖一个方法,您必须了解它是否与新功能冲突。CTRL在这种情况下,QTableWidget 的 keyPressEvent 方法与+快捷方式不冲突,C因为默认情况下它们对该键不执行任何操作,因此为避免丢失以前的功能,您必须调用父级的 super 方法:

def keyPressEvent(self, event):
    super(SubQTableWidget, self).keyPressEvent(event)
    if event.matches(QtGui.QKeySequence.Copy)):
        self.copy_selection()

如果您想以简单的方式处理CTRL+ C,则可以使用 QShortcut ,因此无需覆盖 keyPressEvent 方法:

class SubQTableWidget(QtWidgets.QTableWidget):
    def __init__(self, parent=None):
        super(SubQTableWidget, self).__init__(parent)
        QtWidgets.QShortcut(
            QtGui.QKeySequence(QtGui.QKeySequence.Copy),
            self,
            activated=self.copy_selection,
            context=QtCore.Qt.WidgetShortcut
        )

推荐阅读