Переопределенный QGraphicsView keyPressEvent крадет события из сфокусированных QGraphicsWidgets - PullRequest
2 голосов
/ 06 февраля 2020

Я создал пользовательский QGraphicsView с определенным поведением для определенных событий нажатия клавиш. В представлении отображается QGraphicsScene с QGraphicsProxyWidgets.

. Проблема в том, что как только я переопределяю keyPressEvent в представлении, события не передаются виджетам, поэтому я могу ' введите текстовое поле. Я хочу, чтобы виджеты украли keyPressEvents, когда они сфокусированы.

Я попытался установить флаг ItemIsFocusable для прокси-виджетов и установить политику фокусировки на StrongFocus, среди прочего. Пока не повезло.

У кого-нибудь есть предложения? Я иду по этому поводу неправильно? Спасибо за внимание!

import sys
from Qt import QtWidgets, QtCore


class CustomView(QtWidgets.QGraphicsView):

    def __init__(self, parent):

        super(CustomView, self).__init__(parent)

    def keyPressEvent(self, event):

        if event.key() in (QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace):
            print('Deleting')



app = QtWidgets.QApplication(sys.argv)

groupBox = QtWidgets.QGroupBox("Contact Details")
numberLabel = QtWidgets.QLabel("Telephone number")
numberEdit = QtWidgets.QLineEdit()

layout = QtWidgets.QFormLayout()
layout.addRow(numberLabel, numberEdit)
groupBox.setLayout(layout)

scene = QtWidgets.QGraphicsScene()
proxy = scene.addWidget(groupBox)
proxy.setFlag(QtWidgets.QGraphicsItem.ItemIsFocusable)
proxy.setFocusPolicy(QtCore.Qt.StrongFocus)

view = CustomView(scene)
view.show()

app.exec_()

1 Ответ

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

Если вы переопределите метод и не вызовете реализацию родительского класса, то вы исключите поведение по умолчанию, в вашем случае отправка событий клавиатуры элементам.

Решение состоит в том, чтобы вызвать метод keyPressEvent родительского класса через super:

def keyPressEvent(self, event):
    <b>super(CustomView, self).keyPressEvent(event)</b>
    if event.key() in (QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace):
        print('Deleting')
...