PyQt5 - Показать виртуальную клавиатуру - PullRequest
4 голосов
/ 19 июня 2020

Я пытаюсь понять, как использовать виртуальную клавиатуру для сенсорного экрана, используя python 3.8 и PyQt5 на Windows.

Я видел, что у Qt есть собственный плагин QtVirtualKeyboard. Я в значительной степени следил за тем, что было сделано по этой ссылке , сначала установив Qt 5.15 с поддержкой виртуальной клавиатуры, а затем настроив переменные среды.

Простой пример кода:

import os
import sys

from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QWidget

os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard"


class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.line_edit = None
        self.init_ui()

    def init_ui(self):
        self.line_edit = QLineEdit()
        self.line_edit2 = QLineEdit()
        self.layout = QVBoxLayout()
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.layout.addWidget(self.line_edit)
        self.layout.addWidget(self.line_edit2)
        self.setCentralWidget(self.main_widget)

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

Идея состоит в том, чтобы отображать клавиатуру при касании строки редактирования. На данный момент окно отображается правильно, но клавиатура не выскакивает. Я попытался настроить ("QT_DIR", "QT_PLUGIN_PATH", ...), как указано в приведенной выше ссылке, но ничего не помогло.

Я знаю, что мне что-то там не хватает, но не могу понять, что именно. Спасибо за помощь!

Ответы [ 2 ]

5 голосов
/ 22 июня 2020

Во-первых, это двоичные файлы, связанные с Qt VirtualKeyboard, и чтобы не устанавливать Qt, я использовал aqtinstall (В этом примере Qt 5.15 был установлен, но рекомендуется использовать ту же версию, которая использовалась для компиляции pyqt5: python -c "from PyQt5.QtCore import QT_VERSION_STR; print('Qt version', QT_VERSION_STR)"):

python -m pip install aqtinstall
python -m aqt install 5.15.0 windows desktop win64_msvc2019_64 -m qtvirtualkeyboard --outputdir qt

Затем он находится там, где путь префикса PyQt5:

python -c "from PyQt5.QtCore import QLibraryInfo; print('QT_PREFIX_PATH:', QLibraryInfo.location(QLibraryInfo.PrefixPath))"

Вывод:

QT_PREFIX_PATH: C:/Users/eyllanesc/qt_env/lib/site-packages/PyQt5/Qt

Затем вам нужно скопировать следующее из папки, в которую был установлен Qt (папка называется qt), в путь префикса (полученный с помощью предыдущей команды) PyQt5:

  • Copy "qt / 5.15 .0 / msvc2019_64 / bin / Qt5VirtualKeyboard.dll "в папку" QT_PREFIX_PATH / bin ".
  • Создайте папку" QT_PREFIX_PATH / plugins / platforminputcontexts ".
  • Скопируйте" qt / 5.15.0 " Файл /msvc2019_64/plugins/platforminputcontexts/qtvirtualkeyboardplugin.dll "в" QT_PREFIX_PATH / plugins / platforminputcontexts " .
  • Скопируйте папку «qt / 5.15.0 / msvc2019_64 / qml / QtQuick / VirtualKeyboard» в папку «QT_PREFIX_PATH / qml / QtQuick».

введите описание изображения здесь

Для linux аналогично:

python -m aqt install 5.15.0 linux desktop -m qtvirtualkeyboard --outputdir qt

Затем

  • Скопируйте «qt / 5.15.0 / gcc_64 / bin / libQt5VirtualKeyboard. so.5 "в папку" QT_PREFIX_PATH / lib ".
  • Создайте папку" QT_PREFIX_PATH / plugins / platforminputcontexts ".
  • Скопируйте" qt / 5.15.0 / gcc_64 / plugins / platforminputcontexts / libqtvirtualkeyboardplugin.so "в папку" QT_PREFIX_PATH / plugins / platforminputcontexts ".
  • Скопируйте папку" qt / 5.15.0 / gcc_64 / plugins / virtualkeyboard "в папку" QT_PREFIX_PATH / plugins ".
  • Скопируйте папку "qt / 5.15.0 / gcc_64 / qml / QtQuick / VirtualKeyboard" в папку "QT_PREFIX_PATH / qml / QtQuick".
0 голосов
/ 24 августа 2020

Я не очень хорошо знаком с qvirtualkeyboard, но могу сказать вам самый простой способ сделать это вручную. Существует модуль под названием getkey, который можно установить с помощью команды pip install getkey. С его помощью вы можете более динамично обрабатывать нажатия клавиш. Немного поработав, вы можете создать серию кнопок, которые при нажатии запускают некоторые коды клавиш, например:

key = getkey()
btn = QPushButton("UP Arrow Button")
btn.clicked.connect(someFunc)

А затем ...

def someFunc:
    key = keys.UP

И вуаля! Если вы нажмете на нее, она действует как клавиша со стрелкой вверх. Проявив немного больше творчества, вы можете сделать всплывающую клавиатуру только тогда, когда QLineEdit находится в фокусе. Всего несколько идей ... Надеюсь, это помогло!

...