代码之家  ›  专栏  ›  技术社区  ›  P.R.

操作系统X+Qt:如何在整个GUI中捕获所有按键事件?

  •  3
  • P.R.  · 技术社区  · 11 年前

    我有一个关于Qt和Mac OS X的基本问题。如果我定义 QMainWindow 类并定义 keyPressEvent 功能如下,是不是不应该在按下键时进入该功能 MyWindow ? 我在Linux下遇到了一些问题,在Linux下,如果关注某些小部件(列表视图或编辑框),我不会得到按键事件,但至少如果关注一个按钮,然后按键,我会得到它。在Mac OS X下,我根本没有得到任何响应。

    class MyWindow(QMainWindow):    
        def keyPressEvent(self, event):
            key = event.key()
                    
            if key == Qt.Key_F:
                print("pressed F key")
    

    有什么想法(使用Python和PySide)吗?

    2 回复  |  直到 2 年前
        1
  •  6
  •   Pavel Strakhov    11 年前

    当一个小部件(例如编辑框)使用一个事件时,它通常不会传播到其父小部件,因此您无法从父窗口获取这些事件。您应该在main上安装一个事件筛选器 QApplication 对象通过这种方式,您将接收(并根据需要进行筛选)所有事件。

    看见 Event filters .

        2
  •  0
  •   vvvvv lexa-b    2 年前

    解决方案基于 Pavel's answer :

    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_())
    

    此答案发布为 edit 对这个问题 OS X + Qt: How to capture all key-press events in the entire GUI? 由OP P.R. 根据CC BY-SA 3.0。