重写的QGraphicsView keyPressEvent会从集中的QGraphicsWidgets窃取事件

问题描述 投票:0回答:1

我已经为某些按键事件构建了具有定义行为的自定义QGraphicsView。该视图显示带有QGraphicsSceneQGraphicsProxyWidgets

问题是,一旦我在视图中覆盖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_()
python pyqt5 pyside2
1个回答
0
投票

如果您重写方法并且不调用父类的实现,则将消除默认行为,在这种情况下,将键盘事件发送到项目。

解决方案是通过super调用父类的keyPressEvent方法:

def keyPressEvent(self, event):
    super(CustomView, self).keyPressEvent(event)
    if event.key() in (QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace):
        print('Deleting')
© www.soinside.com 2019 - 2024. All rights reserved.