如何覆盖 QKeyEvents

How to overlay QKeyEvents

这个对话框继承自QMainWindow。它的 keyPressEvent() 方法在按下 Alt + A 组合键时打印出一条消息。

蓝色方块是QLabel。它也应该打印消息,但只有在按下 Alt + Z 键时才会打印。但是 QMainWindow 会阻止 QLabel 的 KeyEvents。即使将鼠标光标放在蓝色 QLabel 上后,点击 Alt + Z 也不会触发任何响应。 有没有办法将两个小部件的事件叠加或汇总在一起?那么 Alt + Z 和 Alt + A 都有效吗?

import sys
from PyQt4 import QtCore, QtGui

class CustomMain(QtGui.QMainWindow):
    def __init__(self, *args, **kwargs):
        QtGui.QMainWindow.__init__(self, *args, **kwargs)
        p = self.palette()
        p.setColor(self.backgroundRole(), QtCore.Qt.red)
        self.setPalette(p)
    def keyPressEvent(self, event):
        if event.modifiers() == QtCore.Qt.AltModifier:
            if event.key() == QtCore.Qt.Key_A:
                print 'QMainWindow: Alt + a'

class Custom(QtGui.QLabel):
    def __init__(self, *args, **kwargs):
        QtGui.QLabel.__init__(self, *args, **kwargs)
        img=QtGui.QImage(64, 64, QtGui.QImage.Format_RGB32)
        img.fill(QtCore.Qt.blue)
        pixmap=QtGui.QPixmap(img)
        self.setPixmap(pixmap)

    def keyPressEvent(self, event):
        if event.modifiers() == QtCore.Qt.AltModifier:
            if event.key() == QtCore.Qt.Key_Z:
                print 'QLabel: Alt + z'

class App(CustomMain):
    def __init__(self, *args, **kwargs):
        CustomMain.__init__(self, *args, **kwargs)
        mainWidget = QtGui.QWidget()

        self.setCentralWidget(mainWidget)
        mainLayout=QtGui.QVBoxLayout()
        mainWidget.setLayout(mainLayout)

        custom=Custom()
        mainLayout.addWidget(custom)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = App()
    w.show()
    sys.exit(app.exec_())

您需要将事件从 QMainWindow 传播到 QLabel:

def keyPressEvent(self, event):
    if event.modifiers() == QtCore.Qt.AltModifier:
        if event.key() == QtCore.Qt.Key_A:
            print 'QMainWindow: Alt + a'
    QtGui.QMainWindow.keyPressEvent(self, event)