我正在尝试了解PyQt4中的事件处理,并偶然发现了一个案例
在更改类定义后,keyPressEvent
会看到除箭头键以外的所有键。
从看到所有键:
class MaskWindow(QtGui.QGraphicsView):
def __init__(self):
QtGui.QGraphicsView.__init__(self)
self.deskTop = QtGui.QDesktopWidget()
self.scene = QtGui.QGraphicsScene(self)
无法看到箭头键,向下翻页和向上翻页,但其他人可以工作,例如 Tab , Shift , a - z :
class MaskWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint|
QtCore.Qt.FramelessWindowHint)
self.deskTop = QtGui.QDesktopWidget()
self.view = QtGui.QGraphicsView(self)
self.scene = QtGui.QGraphicsScene(self)
这是箭头键不再陷阱的键处理程序:
def keyPressEvent(self, event):
key = event.key()
if key == QtCore.Qt.UpArrow
self.diameter += 1
if key == QtCore.Qt.DownArrow:
self.diameter -= 1
课堂改变让我错过了什么?
答案 0 :(得分:2)
您重新实现的keyPressEvent
函数使用了错误的枚举常量。
它应该使用QtCore.Qt.Key枚举:
def keyPressEvent(self, event):
key = event.key()
if key == QtCore.Qt.Key_Up:
self.diameter += 1
if key == QtCore.Qt.Key_Down:
self.diameter -= 1
使用setWidowFlags
函数可以在任何小部件(包括QGraphicsView
)上更改窗口标记:
class MaskWindow(QtGui.QGraphicsView):
def __init__(self):
QtGui.QGraphicsView.__init__(self)
self.setWindowFlags(self.windowFlags() |
QtCore.Qt.WindowStaysOnTopHint |
QtCore.Qt.FramelessWindowHint)
<强>更新强>
重新实现的keyPressEvent
无法与您的示例中的QMainWindow
一起使用的原因是因为它不会再获取任何关键事件 - 它们将转到子窗口小部件键盘焦点。
解决这个问题的一种方法是在要获取关键事件的小部件上设置event filter
:
class MaskWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self, None,
QtCore.Qt.WindowStaysOnTopHint |
QtCore.Qt.FramelessWindowHint)
self.view = QtGui.QGraphicsView(self)
self.view.installEventFilter(self)
self.setCentralWidget(self.view)
def eventFilter(self, source, event):
if (source is self.view and
event.type() == QtCore.QEvent.KeyPress):
key = event.key()
if key == QtCore.Qt.Key_Up:
self.diameter += 1
elif key == QtCore.Qt.Key_Down:
self.diameter -= 1
return QtGui.QMainWindow.eventFilter(self, source, event)