现在从QGraphicsView到QMainWindow,keyPressEvent看不到箭头键

时间:2012-09-04 14:57:23

标签: python event-handling pyqt4

我正在尝试了解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

课堂改变让我错过了什么?

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)