在 PyQT5 中是否有关闭鼠标或键盘移动的应用程序的功能?

Is there a function for closing app on mouse or keyboard movement in PyQT5?

我希望我的应用程序在检测到鼠标或键盘移动时关闭,它没有检测到任何东西,只有在我关闭应用程序时才检测到

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
      QMainWindow.__init__(self, parent=parent)
      self.setupUi(self)

    def keyPressEvent(self, event):
        if event.key():
           self.close()

if __name__ == "__main__":
   import sys
   app = QtWidgets.QApplication(sys.argv)
   w = MainWindow()
   w.showMaximized()
   sys.exit(app.exec_())

如果 child 处理输入事件,则输入事件不会传播到 parent。

如果小部件接受键盘事件,它们将不会被其 parent(s) 接收。

只有当小部件 抓住 鼠标(通常是在单击 那个 小部件之后)或者如果它有mouseTracking 属性 启用 鼠标实际上在小部件上,但 不是 如果鼠标在 child 小部件(或部分覆盖它的小部件)。

由于您的顶级小部件有 children,这些事件可能永远不会收到,因为那些 children 将处理 and/or 接受它们。

解决方案是在全局应用程序上安装事件过滤器,并检查 MouseMoveKeyPress 事件,然后最终退出应用程序,小心使用延迟计时器,因为应用程序仍需要完成其事件队列的处理:

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent=parent)
        self.setupUi(self)
        QApplication.instance().installEventFilter(self)

    def eventFilter(self, obj, event):
        if event.type() in (event.MouseMove, event.KeyPress):
            QTimer.singleShot(0, QApplication.quit)
            return True
        return super().eventFilter(obj, event)