覆盖的 QGraphicsView keyPressEvent 从聚焦的 QGraphicsWidgets 窃取事件
Overridden QGraphicsView keyPressEvent steals events from focused QGraphicsWidgets
我已经构建了一个自定义 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_()
如果您重写一个方法并且不调用父级的实现 class 那么您将消除默认行为,在您的情况下将键盘事件发送到项目。
解决办法是通过super调用父class的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')
我已经构建了一个自定义 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_()
如果您重写一个方法并且不调用父级的实现 class 那么您将消除默认行为,在您的情况下将键盘事件发送到项目。
解决办法是通过super调用父class的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')