python - 重写的 QGraphicsView keyPressEvent 从聚焦的 QGraphicsWidgets 窃取事件

标签 python pyqt5 pyside2

我已经构建了一个自定义的QGraphicsView,其中定义了某些按键事件的行为。该 View 显示带有 QGraphicsProxyWidgetsQGraphicsScene

问题是,一旦我覆盖 View 中的 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_()

最佳答案

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

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

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

关于python - 重写的 QGraphicsView keyPressEvent 从聚焦的 QGraphicsWidgets 窃取事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102859/

相关文章:

python - Django - 在 apache 每个请求创建的所有进程之间共享 RabbitMQ 连接?

python - 如何使用递归计算嵌套列表的最大长度?

python - 将 QColorDialog 添加到 QHBoxLayout

python - 在 python 中使用 pytest 测试基于 QML 的应用程序

python - 为什么我得不到并发执行?

python - 将现有对象重用于不可变对象(immutable对象)?

python - QListWidget 项目突出显示的项目有不同的颜色

linux - Qt Designer on Linux 安装 PySide2(Qt for Python)在哪里?

python - PyQt 中 QWidget 上的圆角

python - Pyqt5列表QPushbutton添加边框图像