如何覆盖 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)
这个对话框继承自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)