Python OSX+;Qt:如何在整个GUI中捕获所有按键事件?
我有一个关于Qt和Mac OS X的基本问题。如果我定义一个Python OSX+;Qt:如何在整个GUI中捕获所有按键事件?,python,macos,qt,pyside,Python,Macos,Qt,Pyside,我有一个关于Qt和Mac OS X的基本问题。如果我定义一个QMainWindow类并定义一个keyPressEvent函数如下,那么每当按下MyWindow中的任何一个键时,它不应该进入这个函数吗?我在Linux下遇到了一些问题,如果某些小部件(列表视图或编辑框)被关注,我就不会得到按键事件,但至少如果我关注一个按钮然后按下一个键,我会得到它。在MacOSX下,我根本没有得到任何回应 class MyWindow(QMainWindow): def keyPressEvent(
QMainWindow
类并定义一个keyPressEvent
函数如下,那么每当按下MyWindow
中的任何一个键时,它不应该进入这个函数吗?我在Linux下遇到了一些问题,如果某些小部件(列表视图或编辑框)被关注,我就不会得到按键事件,但至少如果我关注一个按钮然后按下一个键,我会得到它。在MacOSX下,我根本没有得到任何回应
class MyWindow(QMainWindow):
def keyPressEvent(self, event):
key = event.key()
if key == Qt.Key_F:
print("pressed F key")
有什么想法吗
(使用Python和PySide)
[编辑]基于铺装层的解决方案回答:
import sys
from PySide.QtGui import *
from PySide.QtCore import *
class basicWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.edit = QLineEdit("try to type F", self)
self.eF = filterObj(self)
self.installEventFilter(self.eF)
self.edit.installEventFilter(self.eF)
self.show()
def test(self, obj):
print "received event", obj
class filterObj(QObject):
def __init__(self, windowObj):
QObject.__init__(self)
self.windowObj = windowObj
def eventFilter(self, obj, event):
if (event.type() == QEvent.KeyPress):
key = event.key()
if(event.modifiers() == Qt.ControlModifier):
if(key == Qt.Key_S):
print('standard response')
else:
if key == Qt.Key_F:
self.windowObj.test(obj)
return True
else:
return False
if __name__ == "__main__":
app = QApplication(sys.argv)
w = basicWindow()
sys.exit(app.exec_())
当小部件(例如编辑框)使用事件时,它通常不会传播到其父小部件,因此无法从父窗口获取这些事件。您应该在主
QApplication
对象上安装事件过滤器。这样,您将接收(并根据需要过滤)所有事件
看