gpt4 book ai didi

python - OS X + Qt : How to capture all key-press events in the entire GUI?

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:52 24 4
gpt4 key购买 nike

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

class MyWindow(QMainWindow):    
def keyPressEvent(self, event):
key = event.key()

if key == Qt.Key_F:
print("pressed F key")

有什么想法吗?

(将 Python 与 PySide 结合使用)

[编辑] 基于 Pavels 回答的解决方案:

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 对象上安装一个事件过滤器。这样您将接收(如果需要,还可以过滤)所有事件。

参见 Event filters .

关于python - OS X + Qt : How to capture all key-press events in the entire GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19121955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com