我正在尝试了解 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
换班级我错过了什么?
您重新实现的
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
并且可以使用
QGraphicsView
函数在任何小部件(包括
setWidowFlags
)上更改窗口标志:
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)