You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在树莓派中通过subprocess调用Matchbox键盘实现PyQt5输入框触发展示?

树莓派PyQt5实现输入框获焦弹出系统虚拟键盘

前置准备

先安装树莓派常用的系统虚拟键盘(以matchbox-keyboard为例):

sudo apt-get install matchbox-keyboard

如果偏好其他键盘(如onboard),替换命令为sudo apt-get install onboard即可。


方法一:重写输入框焦点事件

针对单个输入控件,直接重写focusInEvent和focusOutEvent来控制键盘的启动与关闭:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout
import subprocess

class FocusAwareEdit(QLineEdit):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.keyboard_proc = None

    def focusInEvent(self, event):
        super().focusInEvent(event)
        # 启动虚拟键盘(未启动时才执行)
        if not self.keyboard_proc or self.keyboard_proc.poll() is not None:
            self.keyboard_proc = subprocess.Popen(['matchbox-keyboard'])

    def focusOutEvent(self, event):
        super().focusOutEvent(event)
        # 关闭虚拟键盘(正在运行时才执行)
        if self.keyboard_proc and self.keyboard_proc.poll() is None:
            self.keyboard_proc.terminate()
            self.keyboard_proc.wait()

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        layout.addWidget(FocusAwareEdit())
        layout.addWidget(FocusAwareEdit())
        self.setLayout(layout)
        self.setWindowTitle("虚拟键盘测试")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

方法二:全局事件过滤器

如果需要给所有输入控件(如QLineEdit、QTextEdit)统一处理,用Qt事件过滤器实现全局监听:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTextEdit, QVBoxLayout
from PyQt5.QtCore import QEvent
import subprocess

class GlobalKeyboardHandler(QWidget):
    def __init__(self):
        super().__init__()
        self.keyboard_proc = None
        layout = QVBoxLayout()
        layout.addWidget(QLineEdit())
        layout.addWidget(QTextEdit())
        self.setLayout(layout)
        self.setWindowTitle("全局键盘控制")
        # 给应用程序安装事件过滤器
        QApplication.instance().installEventFilter(self)

    def eventFilter(self, obj, event):
        # 只处理输入控件的焦点事件
        if isinstance(obj, (QLineEdit, QTextEdit)):
            if event.type() == QEvent.FocusIn:
                if not self.keyboard_proc or self.keyboard_proc.poll() is not None:
                    self.keyboard_proc = subprocess.Popen(['matchbox-keyboard'])
            elif event.type() == QEvent.FocusOut:
                if self.keyboard_proc and self.keyboard_proc.poll() is None:
                    self.keyboard_proc.terminate()
                    self.keyboard_proc.wait()
        return super().eventFilter(obj, event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = GlobalKeyboardHandler()
    window.show()
    sys.exit(app.exec_())

注意事项

  • 如果键盘进程无法正常终止,可改用subprocess.run(['pkill', 'matchbox-keyboard'])强制结束进程
  • 若使用onboard,只需将代码中subprocess.Popen的参数替换为['onboard']
  • 确保树莓派触摸屏已正确配置,系统能识别触摸输入

内容的提问来源于stack exchange,提问作者Rahul Chalke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:01:36