QLineEdit PyQT5 输入上的火柴盒键盘

Matchbox-Keyboard on input for QLineEdit PyQT5

我想做的是当用户(通过触摸屏)点击可编辑的 QEditLine 时,我希望它显示 Matchbox-Keyboard 供用户输入。未单击时不显示键盘。

我已经浏览了 C 文档和几个 C 示例,但我也迷路了,所以跳转到 Python。我看到有人提到设置 "focus" 有人能给我解释一下吗?

import sys
import os
from PyQt5.QtWidgets import QApplication, QFileDialog, QSlider, QComboBox, QCheckBox, QWidget, QMainWindow, QPushButton, QLabel, QGridLayout, QGroupBox, QRadioButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import pyqtSlot, Qt


class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'GUI TESTS'
        self.left = 0
        self.top = 0
        self.width = 800
        self.height = 400
        self.statusBarMessage = "GUI TEST"
        self.currentSprite = 'TEST.png'
        self.btn1Active = False
        self.btn2Active = False
        self.btn3Active = False
        self.btn4Active = False
        self.btn5Active = False
        self.btn6Active = False
        self.btn7Active = False
        self.btn8Active = False
        self.saveLocationDir = ""
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.statusBar().showMessage(self.statusBarMessage)

        self.userNameLabel = QLabel(self)
        self.userNameLabel.move(0,125)
        self.userNameLabel.setText("What is your name?")
        self.userNameLabel.resize(120,20)

        self.nameInput = QLineEdit(self)
        self.nameInput.move(0,145)
        self.nameInput.resize(200,32)
        self.nameInput.setEchoMode(0)

    @pyqtSlot()
    def showKeyboard(self):
        command = "matchbox-keyboard"
        os.system(command)
import sys
import os
from PyQt5.QtWidgets import QApplication, QFileDialog, QSlider, QComboBox, QCheckBox, QWidget, QMainWindow, QPushButton, QLabel, QGridLayout, QGroupBox, QRadioButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import pyqtSlot, Qt


class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'GUI TESTS'
        self.left = 0
        self.top = 0
        self.width = 800
        self.height = 400
        self.statusBarMessage = "GUI TEST"
        self.currentSprite = 'TEST.png'
        self.btn1Active = False
        self.btn2Active = False
        self.btn3Active = False
        self.btn4Active = False
        self.btn5Active = False
        self.btn6Active = False
        self.btn7Active = False
        self.btn8Active = False
        self.saveLocationDir = ""
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.statusBar().showMessage(self.statusBarMessage)

        self.userNameLabel = QLabel(self)
        self.userNameLabel.move(0,125)
        self.userNameLabel.setText("What is your name?")
        self.userNameLabel.resize(120,20)

        self.nameInput = QLineEdit(self)
        self.nameInput.move(0,145)
        self.nameInput.resize(200,32)
        self.nameInput.setEchoMode(0)
        self.nameInput.mousePressEvent=self.showKeyboard

    @pyqtSlot()
    def showKeyboard(self,event):
        if event.button() == QtCore.Qt.LeftButton:
            QtWidgets.QLineEdit.mousePressEvent(self, event)
            command = "matchbox-keyboard"
            os.system(command)

您可以覆盖 mousePressEvent 并实现该功能

不建议通过分配函数 self.nameInput.mousePressEvent = self.showKeyboard 来覆盖事件方法,因为 QLineEditmousePressEvent 的任务丢失并可能导致意外事件。

此外,mousePressEvent 不是合适的事件,因为您可以多次按下 QLineEdit,它会被回调到键盘。

更好的选择是在 focusInEvent 中启动它并在 focusOutEvent 中删除它:

import sys
import subprocess
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class MatchBoxLineEdit(QLineEdit):
    def focusInEvent(self, e):
        try:
            subprocess.Popen(["matchbox-keyboard"])
        except FileNotFoundError:
            pass

    def focusOutEvent(self,e):
        subprocess.Popen(["killall","matchbox-keyboard"])

class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('GUI TESTS')

        widget = QWidget()
        self.setCentralWidget(widget)
        lay = QVBoxLayout(widget)

        self.userNameLabel = QLabel("What is your name?")
        self.nameInput = MatchBoxLineEdit()

        lay.addWidget(self.userNameLabel)
        lay.addWidget(self.nameInput)

        self.setGeometry(
            QStyle.alignedRect(
                Qt.LeftToRight,
                Qt.AlignCenter,self.sizeHint(), 
                qApp.desktop().availableGeometry()
                )
            )


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = App()
    w.show()
    sys.exit(app.exec_())