Python 无焦点按键事件

Python 无焦点按键事件,python,pyqt5,keypress,Python,Pyqt5,Keypress,我正在编写一个简单的GUI,它将在特定点打开一个opencv窗口。这个窗口有一些非常基本的keyEvents来控制它。我想通过一些功能来推进这一点。因为我的QtGui是我的控制器,所以我认为使用按键事件是一种好方法。我的问题是,如果我在opencv窗口上处于活动状态,则无法触发KeyEvent 那么,如果Gui失焦,如何触发KeyEvent呢 我真的需要用键盘吗 以下代码再现了我的问题: 导入系统 从PyQt5.QtWidgets导入(QApplication,QWidget) 从PyQt5.Q

我正在编写一个简单的GUI,它将在特定点打开一个opencv窗口。这个窗口有一些非常基本的keyEvents来控制它。我想通过一些功能来推进这一点。因为我的QtGui是我的控制器,所以我认为使用按键事件是一种好方法。我的问题是,如果我在opencv窗口上处于活动状态,则无法触发KeyEvent

那么,如果Gui失焦,如何触发KeyEvent呢

我真的需要用键盘吗

以下代码再现了我的问题:

导入系统 从PyQt5.QtWidgets导入(QApplication,QWidget) 从PyQt5.Qt导入Qt 进口cv2 类主窗口(QWidget): 定义初始化(自): super()。\uuuu init\uuuuu() self.first=True def openselect(自): im=cv2.imread(str('.\\images\\Steine\\0a5c8e512e.jpg')) self.r=cv2.选择ROI(“图像”,im) def按键事件(自身,事件): 如果event.key()==Qt.key\u空格和self.first: self.openselect() self.first=False 打印('按键!') 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) win=主窗口() win.show() sys.exit(app.exec_())
只有当小部件有焦点时,才会调用keyPressEvent方法,因此如果焦点有另一个应用程序,则不会通知它,因此如果要检测键盘事件,则必须处理操作系统库,但在python中,它们已经存在报告这些更改的库(
python-m pip install pyinput
):

导入系统 从PyQt5导入QtCore、QtWidgets 从pynput.keyboard导入键、侦听器、键代码 类键监视器(QtCore.QObject): 按键按下=QtCore.pyqtSignal(键码) def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.listener=listener(发布时=self.on发布时) def on_释放(自身,钥匙): self.keyPressed.emit(按键) def停止_监控(自): self.listener.stop() def start_监控(自): self.listener.start() 类主窗口(qtwidts.QWidget): 通过 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) monitor=KeyMonitor() 监视器。按键。连接(打印) monitor.start_monitoring() 窗口=主窗口() window.show() sys.exit(app.exec_())
请提供一个提示,这是我的最低要求:如果我在主窗口上失去焦点,则不会触发按键事件。如果我的窗口处于活动状态,并且我按下任何按钮,控制台将打印。如果不是什么都没有发生。不要关注最小值,因为它是最简单和最琐碎的,因为它只是为了擦除代码,你必须关注可再现性。我指出这一点是因为在你的帖子中你谈到了opencv,但在你的代码中我没有看到任何这方面的内容。你可以用这个简单的代码重现我的问题。我只提到opencv,因为它打开了第二个窗口,我必须与之交互。该问题与opencv无关。所以我没有标记opencv。我已经测试了你的代码,我得到了“按下键!”这不是你所说的。嘿,这是预期的工作,谢谢你到目前为止。我不知道如何在其他方面使用keyinput,而只是打印。在我的例子中,我想切换QMainwindow中复选框的状态。好的,我自己解决了。我在主窗口中加载了监视器,并将其自身设置为父级。