Подкласс виджет для переопределения метода, сохраняя при этом функциональность исходного метода - PullRequest
1 голос
/ 29 февраля 2020

Я хочу использовать 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()

1 Ответ

2 голосов
/ 29 февраля 2020

Чтобы переопределить метод, вы должны понимать, не конфликтует ли он с новой функциональностью. В этом случае метод keyPressEvent в QTableWidget не конфликтует с сокращением CTRL + C, поскольку по умолчанию они ничего не делают с этим ключом, поэтому во избежание потери предыдущей функциональности необходимо вызовите родительский метод super:

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