Использование QtVirtualKeyboard под PyQt6 (3)

Вопрос или проблема

У меня есть несколько вопросов по поводу использования QtVirtualKeyboard в PyQt6, поэтому, так как политика StackOverflow гласит “только один вопрос”, я опубликую несколько вопросов.

Первая часть будет одинаковой, потому что все они относятся к одной и той же настройке.

Общая настройка

Я установил QtVirtualKeyboard, в основном следуя этому ответу (ОГРОМНОЕ спасибо @eyllanesc!).

Точные команды следующие:

python3 -m venv venv
venv/bin/pip install -U pip wheel PyQt6 aqtinstall
QT_PREFIX_PATH=$(venv/bin/python -c "from PyQt6.QtCore import QLibraryInfo; print(QLibraryInfo.path(QLibraryInfo.LibraryPath.PrefixPath), end=None)")
QT_VERSION_STR=$(venv/bin/python -c "from PyQt6.QtCore import QT_VERSION_STR; print(QT_VERSION_STR, end=None)")
QT_VERSION_STR=6.7.3
venv/bin/python -m aqt install-qt linux desktop $QT_VERSION_STR -m qtvirtualkeyboard --outputdir qt
cp -p qt/$QT_VERSION_STR/gcc_64/lib/libQt6VirtualKeyboard.so.$QT_VERSION_STR $QT_PREFIX_PATH/lib/libQt6VirtualKeyboard.so.6
cp -p qt/$QT_VERSION_STR/gcc_64/lib/libQt6VirtualKeyboardSettings.so.$QT_VERSION_STR $QT_PREFIX_PATH/lib/libQt6VirtualKeyboardSettings.so.6
mkdir -p $QT_PREFIX_PATH/plugins/platforminputcontexts
cp -p qt/$QT_VERSION_STR/gcc_64/plugins/platforminputcontexts/libqtvirtualkeyboardplugin.so $QT_PREFIX_PATH/plugins/platforminputcontexts
#cp -pr qt/$QT_VERSION_STR/gcc_64/plugins/virtualkeyboard $QT_PREFIX_PATH/plugins
cp -pr qt/$QT_VERSION_STR/gcc_64/qml/QtQuick/VirtualKeyboard $QT_PREFIX_PATH/qml/QtQuick
mkdir -p $QT_PREFIX_PATH/qml/Qt/labs
cp -pr qt/$QT_VERSION_STR/gcc_64/qml/Qt/labs/folderlistmodel $QT_PREFIX_PATH/qml/Qt/labs

Примечание: Я был вынужден установить QT_VERSION_STR=6.7.3, потому что при использовании значения, полученного из скрипта Python выше (6.7.1), у меня произошла ошибка во время выполнения (что-то вроде 6.7.3 не найдено); может быть, это указывает на то, что что-то не так в моей настройке?

Тестовая программа:

from PyQt6.QtWidgets import QApplication, QWidget, QMainWindow, QLineEdit, QVBoxLayout

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

class MaiWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        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)


app = QApplication(sys.argv)

window = MaiWindow()
window.show()

app.exec()

Программа запускается с помощью: venv.hide/bin/python test.py.

Это корректно отображает виртуальную клавиатуру при фокусировке на любом из QLineEdit.

Вопрос 3

Возможно ли программно устанавливать свойства QtVirtualKeyboard?

Конкретная необходимость заключается в установке языка ОСК (в моей системе LANG=en_US.UTF-8, но моя системная клавиатура – это it-IT, и мне нужен ОСК el.GR).

Другие настройки (например, размещение ОСК внизу окна, а не внизу экрана) были бы “желательными”.

Ответ или решение

Использование QtVirtualKeyboard в PyQt6: Подробное руководство

Вопрос о том, как использовать QtVirtualKeyboard в PyQt6, становится все более актуальным среди разработчиков, работающих с библиотекой Python для создания графических интерфейсов. В ответ на возникшие вопросы мы рассмотрим, как настраивать виртуальную клавиатуру, в том числе программно устанавливать ее параметры, такие как язык и позиция на экране.

Общая настройка

Перед тем, как ответить на ваш вопрос о программной настройке свойств QtVirtualKeyboard, важно убедиться в правильности установки и интеграции компонента. Вы правильно выполнили команды для установки и настройки QtVirtualKeyboard, и это позволяет вам видеть клавиатуру при взаимодействии с QLineEdit. Однако стоит отметить, что упомянутая вами ошибка, связанная с версией Qt (6.7.1 против 6.7.3), может указывать на несоответствие в вашей установке. Рекомендуется удостовериться, что все компоненты библиотеки Qt соответствуют одной и той же версии.

Программная настройка свойств QtVirtualKeyboard

Теперь переходя к вашему вопросу. К сожалению, возможность программной установки параметров виртуальной клавиатуры в текущей версии QtVirtualKeyboard ограничена. Однако вы можете задать язык OSK и в некоторых случаях изменить положение клавиатуры через QML.

Установка языка OSK

Чтобы установить язык виртуальной клавиатуры, вам нужно будет внести изменения в конфигурацию при запуске приложения. Например, для установки языка на греческий (el.GR), вы можете воспользоваться следующим кодом:

import os
os.environ["QT_VIRTUALKEYBOARD_LANGUAGE"] = "el_GR"

Это назначение должно быть установлено до создания экземпляра вашего приложения QApplication.

Изменение положения клавиатуры

Как правило, виртуальная клавиатура отображается по умолчанию внизу экрана. На данный момент в Qt отсутствует встроенный способ фиксирования положения клавиатуры в пределах окна приложения. Тем не менее, вы можете изменить некоторые аспекты ее представления через QML.

Для изменения положения клавиатуры вы можете использовать интерфейс QML. Например, можно создать свои собственные настройки отображения клавиатуры в QML, где вы могли бы указать, как и где должны отображаться ваши интерфейсы.

Пример реализации

Вот как может выглядеть пример, объединяющий установку языка и использование QML (обратите внимание, что это заглавная основа, реальная реализация может варьироваться):

import sys
import os
from PyQt6.QtWidgets import QApplication, QMainWindow, QLineEdit, QVBoxLayout, QWidget
from PyQt6.QtCore import QUrl
from PyQt6.QtQml import QQmlApplicationEngine

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

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Пример QtVirtualKeyboard")
        self.resize(640, 480)

        self.line_edit = QLineEdit()
        self.layout = QVBoxLayout()
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.layout.addWidget(self.line_edit)
        self.setCentralWidget(self.main_widget)

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

Заключение

Ваши вопросы касательно QtVirtualKeyboard в PyQt6 имеют важное значение для правильной настройки пользовательского интерфейса. Обратите внимание на необходимость уточнения версии библиотеки и настройку языка клавиатуры, что может быть критически важным для обеспечения локализации вашего приложения. На данный момент возможности по программной настройке клавиатуры ограничены, но использование QML может расширить ваши возможности по настройке. Рекомендуем следить за обновлениями библиотеки, поскольку с новыми релизами могут появиться новые возможности.

Оцените материал
Добавить комментарий

Капча загружается...