Техническое руководство
Обзор
Данный документ предоставляет технический обзор плагина Qt Virtual Keyboard.
Основные понятия
Проект Qt Virtual Keyboard представляет собой плагин контекста ввода Qt 5, который реализует интерфейсы QPlatformInputContextPlugin и QPlatformInputContext. Эти интерфейсы позволяют использовать плагин в качестве плагина контекста ввода платформы в приложениях Qt 5.
Сам плагин предоставляет фреймворк для ввода, поддерживающий несколько методов ввода, а также QML-интерфейс для виртуальной клавиатуры. Фреймворк для ввода расширяем через интерфейс плагина, что позволяет загружать сторонние методы ввода и раскладки клавиатуры во время выполнения.
Фреймворк для ввода предоставляет следующие основные интерфейсы:
- QVirtualKeyboardInputContext: предоставляет контекстную информацию для виртуальной клавиатуры и других компонентов ввода. Выступает в роли интерфейса к компоненту ввода текста.
- QVirtualKeyboardInputEngine: предоставляет API для интеграции событий ввода пользователя (нажатия клавиш и т.д.) и служит хостом для методов ввода.
- QVirtualKeyboardAbstractInputMethod: базовый тип для методов ввода на C++. Метод ввода обычно обрабатывает события нажатия клавиш, но также может обрабатывать события мыши и сенсорного ввода.
- InputMethod: базовый тип для методов ввода на QML. Метод ввода обычно обрабатывает события нажатия клавиш, но также может обрабатывать события мыши и сенсорного ввода.
- QVirtualKeyboardExtensionPlugin: интерфейс плагина для расширений виртуальной клавиатуры, предоставляющих дополнительную функциональность.
Контекст ввода
Контекст ввода используется клавиатурой, а также конкретными методами ввода. InputContext — это экземпляр синглтона, размещённый в QML. Приложение не должно напрямую взаимодействовать с контекстом ввода.
Контекстная информация
Контекст ввода предоставляет доступ к контекстной информации, которая поступает из приложения. Эта информация включает, но не ограничивается:
- InputContext::cursorPosition
- InputContext::cursorRectangle
- InputContext::inputMethodHints
- InputContext::preeditText
- InputContext::selectedText
- InputContext::surroundingText
Локаль
Список поддерживаемых локалей определяется наличием каталога локалей в "layouts/*". Каждый каталог локалей может содержать один или несколько файлов раскладки, например fi_FI/main.qml или symbols.qml. Если локальная раскладка не отличается от резервной, то можно добавить файл-заполнитель <layout типа>.fallback для раскладки. Это укажет, что для резервной раскладки можно использовать виртуальную клавиатуру.
По меньшей мере, каталог раскладки должен содержать файлы:
dialpad.fallbackdigits.fallbackmain.fallbacknumbers.fallbacksymbols.fallback
Приложение может указать начальную раскладку, изменив локаль по умолчанию. Однако это необходимо сделать до инициализации приложения и загрузки плагина метода ввода. Если изменения в локаль по умолчанию не внесены, используется текущая системная локаль.
Сопоставление локалей клавиатуры выполняется в следующем порядке:
Сначала локаль сопоставляется с полным именем локали. Если полное совпадение не найдено, то сопоставляется только язык локали. Если частичное совпадение не найдено, используется локаль "en_GB" как резервная.
После выбора локали клавиатура обновляет локаль ввода и направление ввода для соответствия текущей раскладке. Приложение может получить эту информацию через интерфейс QInputMethod.
Внутренне текущая локаль ввода также обновляется для QVirtualKeyboardInputEngine и текущих экземпляров методов ввода.
Двигатель ввода
Объект двигателя ввода принадлежит InputContext. Как и InputContext, существует только один экземпляр QVirtualKeyboardInputEngine. Двигатель ввода содержит функции API, которые клавиатура использует для сопоставления пользовательских взаимодействий, таких как события нажатия и отпускания клавиш, методу ввода.
Например, события нажатия клавиш виртуальной клавиатуры сопоставляются с помощью следующих методов:
Вышеупомянутые методы предназначены для интеграции виртуальной клавиатуры, отсюда и слово «виртуальный» в именах методов. Это также означает, что методы не подходят для сопоставления нажатий физических клавиш. Это следствие того, что фактическое действие выполняется только при отпускании клавиши.
Если нажатие клавиши прерывается до события отпускания клавиши, клавиатура вызывает метод QVirtualKeyboardInputEngine::virtualKeyCancel.
Метод ввода
Метод ввода представляет собой конкретную реализацию обработчика нажатий клавиш. Его основная функция — обработка событий нажатия клавиш и сохранение информации о состоянии пользовательского ввода. Он взаимодействует с редактором текста через QVirtualKeyboardInputContext с помощью предварительного текста или событий нажатия клавиш.
Экземпляр метода ввода можно создать различными способами, в зависимости от сценария использования:
-
KeyboardLayout::inputMethod: раскладка клавиатуры может создавать экземпляр метода ввода исключительно для этой раскладки. Следует отметить, что этот экземпляр будет уничтожен при изменении раскладки клавиатуры. Поэтому этот метод обычно ограничен очень узкими сценариями использования. -
KeyboardLayout::createInputMethod(): раскладка клавиатуры может динамически создавать метод ввода, который может использоваться с этой раскладкой, а также с общими раскладками (например, символьной раскладкой). Это предпочтительный способ создания специализированных методов ввода, таких как методы, связанные со сложными языками или рукописным вводом. -
DefaultInputMethod: виртуальная клавиатура пытается создать этот тип метода ввода при запуске. Этот экземпляр будет использоваться в качестве метода ввода по умолчанию для всех раскладок клавиатуры, если только раскладка клавиатуры не использует пользовательский метод ввода. Этот экземпляр сохраняется при изменениях раскладки клавиатуры между языками и является предпочтительным способом создания и переопределения метода ввода по умолчанию.
Плагин расширения виртуальной клавиатуры
Плагин расширения позволяет сторонним поставщикам улучшать функциональность виртуальной клавиатуры без её перекомпиляции. В настоящее время плагин расширения может предоставлять раскладки клавиатуры и пользовательские методы ввода.
Создание плагина для Qt Virtual Keyboard аналогично стандартному способу создания плагинов Qt:
-
Ссылка на библиотеку virtualkeyboard.
Модуль virtualkeyboard должен быть подключен к плагину:
QT += virtualkeyboard
Это позволяет плагину получить доступ к QVirtualKeyboardInputContext и другим интерфейсам.
-
Реализация подкласса QVirtualKeyboardExtensionPlugin.
Плагин предоставляет виртуальной клавиатуре необходимую метаданные, что позволяет сортировать и загружать плагины.
Добавление раскладок клавиатуры
Плагин может добавлять раскладки клавиатуры для виртуальной клавиатуры, включая файлы раскладок в ресурсы Qt бинарного файла плагина.
Виртуальная клавиатура ищет раскладки клавиатуры (по языку) из определённого пути /QtQuick/VirtualKeyboard/content/layouts/<language_COUNTRY>, поэтому крайне важно использовать этот точный путь также в плагине. Пути ресурсов Qt могут перекрываться, однако плагин не может переопределять существующие раскладки в плагине виртуальной клавиатуры.
Если плагину расширения нужно переопределить встроенную раскладку клавиатуры, необходимо перекомпилировать виртуальную клавиатуру только с определёнными языками (например, CONFIG+=lang-en) или без раскладок клавиатуры (например, CONFIG+=disable-layouts). В качестве альтернативы, если перекомпиляция невозможна, можно переопределить встроенные раскладки клавиатуры и загружать их непосредственно из файловой системы, используя переменную среды QT_VIRTUALKEYBOARD_LAYOUT_PATH.
Добавление метода ввода
Плагин может регистрировать метод ввода, который другие раскладки клавиатуры могут использовать по умолчанию (например, DefaultInputMethod) или метод ввода, который используется в плагине в частном порядке.
Метод ввода должен реализовывать интерфейс QVirtualKeyboardAbstractInputMethod (C++) или InputMethod (QML), и плагин должен зарегистрировать его как тип QML в методе {QVirtualKeyboardExtensionPlugin::registerTypes}.
Метаданные для плагина расширения
Метаданные позволяют виртуальной клавиатуре просмотреть плагин перед загрузкой фактической библиотеки. Они также предотвращают загрузку виртуальной клавиатурой конфликтующих плагинов расширений, например двух плагинов для рукописного ввода.
Name |
Required |
Это поле определяет имя плагина. Доступны несколько встроенных плагинов по умолчанию:
|
Provider |
Optional |
Информативное имя поставщика плагина. Используется в основном для диагностики. |
InputMethod |
Optional |
Это поле сообщает виртуальной клавиатуре, что плагин содержит метод ввода. При определении этого поля виртуальная клавиатура вызовет интерфейс для регистрации типов QML. Подобно Name, может быть только один поставщик для каждого метода ввода. |
Version |
Required |
Целое число, определяющее номер версии плагина. Если доступно два или более плагина одной и той же Name, предпочтительнее тот, у которого больший номер версии. |
Следующий пример метаданных взят из плагина расширения Lipi-Toolkit (lipi.json):
{
"Name": "handwriting",
"Provider": "Qt Lipi-Toolkit Extension",
"InputMethod": "HandwritingInputMethod",
"Version": 100
} Реализация пользовательского метода ввода
Реализация методов ввода начинается с выбора используемого интерфейса; QML или C++. В этом примере используется интерфейс QML.
Следующий пример демонстрирует минимальную функциональность, необходимую от метода ввода:
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
import QtQuick 2.0
import QtQuick.VirtualKeyboard 1.0
// file: CustomInputMethod.qml
InputMethod {
function inputModes(locale) {
return [InputEngine.Latin];
}
function setInputMode(locale, inputMode) {
return true
}
function setTextCase(textCase) {
return true
}
function reset() {
// TODO: reset the input method without modifying input context
}
function update() {
// TODO: commit current state and update the input method
}
function keyEvent(key, text, modifiers) {
var accept = false
// TODO: Handle key and set accept or fallback to default processing
return accept;
}
} Метод InputMethod::inputModes() вызывается движком ввода перед установкой режима ввода. Метод возвращает список режимов ввода, доступных в данном языке.
Метод ввода инициализируется в методе InputMethod::setInputMode() с языком и режимом ввода. После установки языка и режима ввода метод ввода должен быть готов к использованию.
InputMethod::reset() вызывается, когда метод ввода необходимо сбросить. Сброс должен затрагивать только внутреннее состояние метода ввода, а не текст пользователя.
InputMethod::update() вызывается при обновлении контекста ввода, и состояние ввода, возможно, не синхронизировано. Метод ввода должен подтвердить текущий текст.
Обработка событий нажатия клавиш выполняется в методе InputMethod::keyEvent(). Этот метод обрабатывает одно событие нажатия клавиши и возвращает true если событие было обработано. В противном случае событие нажатия клавиши обрабатывается методом ввода по умолчанию.
Списки выбора
Списки выбора — это необязательная функция, которую можно интегрировать в метод ввода. Система ввода поддерживает различные типы списков, такие как список кандидатов слов. Ответственность за реализацию списков распределена таким образом, что метод ввода отвечает за содержимое и действия, такие как поведение кликов. Система ввода отвечает за поддержание модели списка и передачу её пользовательскому интерфейсу.
Распределение списков выбора
Списки выбора распределяются при активации метода ввода. Метод InputMethod::selectionLists() возвращает список необходимых типов списков выбора:
function selectionLists() {
return [SelectionListModel.Type.WordCandidateList];
} В приведенном выше примере метод ввода распределяет список кандидатов слов для своего использования.
Обновление списков выбора
Когда метод ввода требует от пользовательского интерфейса обновить содержимое списка выбора, он отправит сигнал InputMethod::selectionListChanged. Аналогично, если метод ввода требует от пользовательского интерфейса выделить элемент в списке, он отправит сигнал InputMethod::selectionListActiveItemChanged.
selectionListChanged(SelectionListModel.Type.WordCandidateList) selectionListActiveItemChanged(SelectionListModel.Type.WordCandidateList, wordIndex)
Заполнение элементов в списках выбора
Элементы заполняются методами обратного вызова, которые обеспечат количество элементов в списке, а также данные для отдельных элементов.
Обратный вызов InputMethod::selectionListItemCount запрашивает количество элементов в списке, идентифицированном заданным типом.
function selectionListItemCount(type) {
if (type == SelectionListModel.Type.WordCandidateList) {
return wordList.length
}
return 0
} Обратный вызов InputMethod::selectionListData запрашивает данные для элементов.
function selectionListData(type, index, role) {
var result = null
if (type == SelectionListModel.Type.WordCandidateList) {
switch (role) {
case SelectionListModel.Role.Display:
result = wordList[index]
break
default:
break
}
}
return result
} Параметр role определяет, какие данные запрашиваются для элемента. Например, SelectionListModel.Role.Display запрашивает данные отображаемого текста.
Реагирование на действия пользователя
Когда пользователь выбирает элемент в списке, метод ввода реагирует на событие в методе обратного вызова InputMethod::selectionListItemSelected.
function selectionListItemSelected(type, index) {
if (type == SelectionListModel.Type.WordCandidateList) {
inputContext.commit(wordlist[index])
update()
}
} Интеграция распознавания рукописного ввода
Начиная с версии 2.0 виртуальной клавиатуры, методы ввода могут потреблять данные сенсорного ввода с сенсорных экранов или других устройств ввода. Это позволяет интегрировать движок распознавания рукописного ввода в виртуальную клавиатуру без внесения изменений в существующие макеты клавиатуры (поскольку виртуальная клавиатура уже предоставляет макеты клавиатуры для рукописного ввода для большинства языков).
Для метода ввода распознавание рукописного ввода работает по тому же принципу, что и обработка обычного ввода с клавиатуры, т.е. данные ввода собираются макетом клавиатуры и передаются движком ввода методу ввода для обработки.
Модель данных для ввода рукописного текста
Виртуальная клавиатура собирает данные рукописного ввода в специальной модели данных QVirtualKeyboardTrace. Каждый след представляет собой набор данных, взятых с одного прикосновения (например, свайп по экрану). Будет столько экземпляров QVirtualKeyboardTrace, сколько прикосновений к области ввода рукописного текста.
По определению, след — это набор данных, взятых с одного прикосновения. Помимо базовых данных точки, он также может содержать другие типы данных, такие как время каждой точки. Метод ввода может определить желаемые каналы ввода в начале события следа.
Метод ввода не участвует в фактическом сборе данных следа. Однако метод ввода имеет полный контроль над вводом, поскольку он может принять или отклонить QVirtualKeyboardTrace (например, если есть слишком много экземпляров для обработки). Это также позволяет точно контролировать, сколько пальцев может использоваться одновременно.
Метод ввода может собирать столько следов, сколько посчитает нужным, и может начать их обработку по мере необходимости. Обработка может даже выполняться параллельно во время выборки данных, хотя это не рекомендуется из-за потенциальных проблем с производительностью. Рекомендуемый способ — начать обработку в фоновом потоке после подходящей задержки с последнего ввода, чтобы обработка не повлияла отрицательно на пользовательский интерфейс.
API следов для методов ввода
API следов состоит из следующих виртуальных методов, которые метод ввода должен реализовать для получения и обработки данных ввода следов.
Реализовав эти методы, метод ввода может получать и обрабатывать данные из различных источников ввода (например, макет клавиатуры или весь экран).
Взаимодействие со следами начинается, когда источник ввода обнаруживает новую точку контакта и вызывает метод traceBegin для нового объекта следа. Если метод ввода принимает взаимодействие, он создает новый объект следа и возвращает его вызывающей стороне. С этого момента данные следа собираются до тех пор, пока не будет вызван метод traceEnd.
При вызове метода traceEnd метод ввода может начать обработку данных, содержащихся в объекте следа. После обработки данных метод ввода должен уничтожить объект. Это также удаляет след, отображаемый на экране.
Макеты клавиатуры
Макеты клавиатуры находятся в каталоге src/virtualkeyboard/content/layouts. Каждый подкаталог каталога макетов представляет локаль. Каталог локали — это строка вида «язык_страна», где язык — это двухбуквенный код языка ISO 639 в нижнем регистре, а страна — двух- или трехбуквенный код страны ISO 3166 в верхнем регистре.
Типы макетов
Различные типы макетов клавиатуры используются в разных режимах ввода. По умолчанию макет, который используется для обычного ввода текста, называется «основным» макетом. Тип макета определяется именем файла макета. Поэтому файл «основного» макета называется «main.qml».
Список поддерживаемых типов макетов:
-
mainОсновной макет для обычного ввода текста -
symbolsМакет символов для специальных символов и т.д. (активируется из основного макета) -
numbersМакет чисел для форматированных чисел (активируется с помощью Qt::ImhFormattedNumbersOnly) -
digitsМакет только цифр (активируется с помощью Qt::ImhDigitsOnly) -
dialpadМакет набора для ввода телефонного номера (активируется с помощью Qt::ImhDialableCharactersOnly) -
handwritingМакет рукописного ввода для распознавания рукописного ввода (активируется из основного макета)
Добавление новых макетов клавиатуры
Элемент макета клавиатуры должен основываться на типе QML KeyboardLayout. Этот тип определяет корневой элемент макета. Корневой элемент имеет следующие необязательные свойства, которые можно установить при необходимости:
property var inputMethod |
Указывает метод ввода для этого макета. Если метод ввода не определен, используется текущий метод ввода. |
property int inputMode |
Указывает режим ввода для этого макета. |
property real keyWeight |
Указывает значение веса по умолчанию для всех клавиш в этом макете клавиатуры. Вес клавиши — это пропорциональное значение, влияющее на размер отдельных клавиш по отношению друг к другу. |
Новые строки в макете клавиатуры добавляются с помощью типа KeyboardRow. Тип KeyboardRow также может указать значение веса по умолчанию для своих дочерних элементов. В противном случае, вес клавиши наследуется от родительского элемента.
Новые клавиши добавляются в строку клавиатуры с помощью типа Key или одного из специализированных типов клавиш. Ниже приведен список всех типов клавиш:
- Key
- BackspaceKey
- ChangeLanguageKey
- EnterKey
- FillerKey
- HideKeyboardKey
- NumberKey
- ShiftKey
- SpaceKey
- SymbolModeKey
- HandwritingModeKey
- TraceInputKey
Например, чтобы добавить обычную клавишу, которая отправляет событие клавиши методу ввода:
import QtQuick 2.0
import QtQuick.Layouts 1.0
import QtQuick.VirtualKeyboard 2.1
// file: layouts/en_GB/main.qml
KeyboardLayout {
keyWeight: 160
KeyboardRow {
Key {
key: Qt.Key_Q
text: "q"
}
}
} Расчёт размера клавиш
Макеты клавиатуры масштабируются, что означает, что нельзя устанавливать фиксированные размеры для каких-либо элементов в макете. Вместо этого ширина клавиш вычисляется на основе веса клавиш по отношению друг к другу, а высота определяется равным распределением пространства между строками клавиатуры.
В приведенном выше примере размер клавиши наследуется от родительских элементов в таком порядке:
Key > KeyboardRow > KeyboardLayout
Эффективное значение веса клавиши будет равно 160. Для примера добавим ещё одну клавишу, которая указывает пользовательский вес клавиши:
import QtQuick 2.0
import QtQuick.Layouts 1.0
import QtQuick.VirtualKeyboard 2.1
// file: layouts/en_GB/main.qml
KeyboardLayout {
keyWeight: 160
KeyboardRow {
Key {
key: Qt.Key_Q
text: "q"
}
Key {
key: Qt.Key_W
text: "w"
keyWeight: 200
}
}
} Теперь общий вес клавиш в строке равен 160 + 200 = 360. Когда макет клавиатуры активирован, ширина каждой клавиши вычисляется следующим образом:
ширина клавиши в пикселях = вес клавиши / СУММА(весов клавиш в строке) * ширина строки в пикселях
Это означает, что клавиатура может быть масштабирована до любого размера, при этом относительные размеры клавиш остаются неизменными.
Альтернативные клавиши
Клавиша может указать свойство alternativeKeys, что приводит к появлению всплывающего списка альтернативных клавиш, когда пользователь удерживает нажатой клавишу. alternativeKeys может указать строку или список строк. Если alternativeKeys — это строка, пользователь может выбирать между символами в строке.
Стили и макеты
Макеты клавиатуры не могут указывать какие-либо визуальные элементы. Вместо этого макет визуализируется стилем клавиатуры. С другой стороны, стиль клавиатуры не может влиять на размер макета клавиатуры.
Макеты клавиатуры с несколькими страницами клавиш
Некоторые макеты клавиатуры, такие как макеты символов, могут содержать больше клавиш, чем можно представить на одной клавиатуре. Решением является вложение нескольких макетов клавиатуры в один контекст с помощью KeyboardLayoutLoader.
Когда KeyboardLayoutLoader используется как корневой элемент макета клавиатуры, фактические макеты клавиатуры заключены в элементы Component. Макет клавиатуры активируется путём назначения id активного компонента свойству sourceComponent.
Например:
import QtQuick 2.0
import QtQuick.Layouts 1.0
import QtQuick.VirtualKeyboard 2.1
// file: layouts/en_GB/symbols.qml
KeyboardLayoutLoader {
property bool secondPage
onVisibleChanged: if (!visible) secondPage = false
sourceComponent: secondPage ? page2 : page1
Component {
id: page1
KeyboardLayout {
KeyboardRow {
Key {
displayText: "1/2"
functionKey: true
onClicked: secondPage = !secondPage
}
}
}
}
Component {
id: page2
KeyboardLayout {
KeyboardRow {
Key {
displayText: "2/2"
functionKey: true
onClicked: secondPage = !secondPage
}
}
}
}
} Макет клавиатуры для рукописного ввода
Каждый язык, поддерживающий распознавание рукописного ввода, должен предоставить специальный макет клавиатуры под названием handwriting.qml.
Этот тип макета клавиатуры должен соответствовать следующим требованиям:
- содержит TraceInputKey в макете клавиатуры
- предоставляет экземпляр HandwritingInputMethod в качестве метода ввода.
Макет рукописного ввода также может включать ChangeLanguageKey. Для этого важно использовать атрибут customLayoutsOnly, который будет фильтровать языки, не использующие рукописный ввод.
И основной, и макет рукописного ввода должны содержать клавишу для активации и деактивации режима рукописного ввода. Это можно сделать, добавив HandwritingModeKey в макет.
Добавление пользовательских макетов
Система макетов виртуальной клавиатуры поддерживает встроенные макеты, а также пользовательские макеты. Встроенные макеты встроены в виде Qt Resources в двоичный файл плагина. Пользовательские макеты находятся в файловой системе, так что их можно установить без перекомпиляции самой виртуальной клавиатуры, или они могут располагаться в файле ресурсов.
Выбор макетов во время выполнения зависит от переменной среды QT_VIRTUALKEYBOARD_LAYOUT_PATH.
Если переменная среды не установлена или содержит недопустимый каталог, виртуальная клавиатура возвращается к стандартным встроенным макетам.
Чтобы предотвратить включение встроенных макетов в плагин виртуальной клавиатуры при использовании пользовательских макетов, добавьте disable-layouts в переменную qmake CONFIG. Дополнительная информация приведена в Дополнительных параметрах конфигурации.
Стили клавиатуры
Система стилей виртуальной клавиатуры поддерживает встроенные стили, а также пользовательские стили. Встроенные стили встроены в виде Qt Resources в двоичный файл плагина, а пользовательские стили расположены в файловой системе и могут быть установлены без перекомпиляции самой виртуальной клавиатуры.
Выбор стиля во время выполнения зависит от переменной среды QT_VIRTUALKEYBOARD_STYLE, которая может быть установлена на имя встроенного стиля, например, "retro", или на любое из пользовательских стилей, установленных в каталог Styles:
$$[QT_INSTALL_QML]/QtQuick/VirtualKeyboard/Styles
Если переменная среды не установлена или содержит недопустимое имя стиля, виртуальная клавиатура использует стандартный встроенный стиль.
Добавление пользовательских стилей
Процесс создания нового стиля начинается с создания новой подпапки для стиля в пути импорта QML по адресу URL-адресу в структуре каталогов QtQuick/VirtualKeyboard/Styles/. См. QML Import Path для получения информации о путях импорта QML. Имя каталога не может содержать пробелов или специальных символов, кроме подчеркивания. Кроме того, имя каталога не может совпадать с именем встроенного стиля, который в настоящее время включает "default" и "retro".
Хорошей отправной точкой для создания нового стиля является использование существующего встроенного стиля в качестве шаблона и его редактирование. Вы можете найти встроенные стили в каталоге источников виртуальной клавиатуры src/virtualkeyboard/content/styles. Скопируйте одну из папок, содержащих встроенный стиль, в каталог Styles и переименуйте ее в "test". Структура каталогов должна теперь выглядеть следующим образом:
test/default_style.qrc test/style.qml test/images test/images/backspace.png test/images/check.png test/images/enter.png test/images/globe.png test/images/hidekeyboard.png test/images/search.png test/images/shift.png
Файл конфигурации QRC, который в данном случае не требуется, можно безопасно удалить.
Примечание: Файл style.qml не следует переименовывать, иначе виртуальная клавиатура не сможет загрузить стиль.
Далее откройте файл style.qml в вашем любимом редакторе и установите свойство resourcePrefix в пустую строку. Префикс ресурсов не нужен, так как ресурсы содержатся в той же папке, что и файл style.qml.
Кроме того, чтобы было более очевидно, что пользовательский стиль действительно загружается и используется, измените цвет фона клавиатуры:
keyboardBackground: Rectangle {
color: "gray"
} Последний шаг — запустить пример приложения с вашим пользовательским стилем:
QT_VIRTUALKEYBOARD_STYLE=test virtualkeyboard
Использование Qt Virtual Keyboard с QQuickWidget
При использовании Qt Virtual Keyboard в QQuickWidget на сенсорном устройстве необходимо установить атрибут Qt::WA_AcceptTouchEvents с помощью QWidget::setAttribute(). Без этого атрибута события от сенсорного устройства будут преобразовываться в синтезированные события мыши.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/technical-guide.html