1

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

换课时我错过了什么?

4

1 回答 1

3

您重新实现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)
于 2012-09-04T21:59:50.183 回答