从 QGraphicsView 转到 QMainWindow 现在 keyPressEvent 没有看到箭头键

问题描述 投票:0回答:1

我正在尝试了解 PyQt4 中的事件处理,并偶然发现了一个案例 更改类定义后,

keyPressEvent
可以看到除箭头键之外的所有键。

从看到所有按键:

class MaskWindow(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.deskTop = QtGui.QDesktopWidget()
        self.scene = QtGui.QGraphicsScene(self)

看不到箭头键、向下翻页和向上翻页,但其他键可以使用,例如TabShifta-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

换班级我错过了什么?

python event-handling pyqt4 keyboard-shortcuts qgraphicsview
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)
© www.soinside.com 2019 - 2024. All rights reserved.