子类化小部件以覆盖方法,同时保留原始方法功能

Subclass a widget to override method, while keeping original method functionality

我想用CTRL+C从QTableWidget复制数据。为此,我对 QTableWidget 进行了子类化,并重写了 keyPressEvent() 方法,效果很好。然而,这失去了有用的 keyPressEvent() 功能,例如使用方向键滚动 table.

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

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()

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

def keyPressEvent(self, event):
    <b>super(SubQTableWidget, self).keyPressEvent(event)</b>
    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
        )