Spec-Zone.ru › Qt 5.12

Техническое руководство

Обзор

В данном документе представлен технический обзор плагина виртуальной клавиатуры Qt.

Основные понятия

Проект 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.fallback
  • digits.fallback
  • main.fallback
  • numbers.fallback
  • symbols.fallback

Приложение может указать начальную раскладку, изменив локаль по умолчанию. Однако это необходимо сделать до инициализации приложения и загрузки плагина метода ввода. Если изменения в локале по умолчанию не были внесены, используется текущая системная локаль.

Сопоставление локали клавиатуры выполняется в следующей последовательности:

  • layouts/<language>_<country>
  • layouts/<language>_*
  • layouts/en_GB

Сначала локаль сопоставляется с полным именем локали. Если полное совпадение не найдено, то сопоставляется только язык локали. Если частичное совпадение не найдено, используется локаль "en_GB" в качестве резервной.

После выбора локали клавиатура обновляет локаль ввода и направление ввода в соответствии с текущей раскладкой. Приложение может получить эту информацию через интерфейс QInputMethod.

Внутренне текущая локаль ввода также обновляется для QVirtualKeyboardInputEngine и текущих экземпляров методов ввода.

Движок ввода

Объект движка ввода принадлежит InputContext. Как и в случае с InputContext, существует только один экземпляр QVirtualKeyboardInputEngine. Движок ввода содержит функции API, которые клавиатура использует для сопоставления пользовательских взаимодействий, таких как события нажатия и отпускания клавиш, с методом ввода.

Например, события нажатия клавиш виртуальной клавиатуры сопоставляются с помощью следующих методов:

  • QVirtualKeyboardInputEngine::virtualKeyPress
  • QVirtualKeyboardInputEngine::virtualKeyRelease

Перечисленные выше методы предназначены для интеграции виртуальной клавиатуры, отсюда и слово «виртуальный» в именах методов. Это также означает, что эти методы не подходят для сопоставления нажатий физических клавиш. Это следствие того факта, что фактическое действие выполняется только при отпускании клавиши.

Если нажатие клавиши прерывается до события отпускания клавиши, клавиатура вызывает метод 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}.

Метаданные для плагина расширения

Метаданные позволяют виртуальной клавиатуре просмотреть плагин перед загрузкой фактической библиотеки. Они также предотвращают загрузку виртуальной клавиатурой конфликтующих плагинов расширений, например, двух плагинов рукописного ввода.

END_OF_DOCUMENT_MARKER
Name Required Это поле определяет имя плагина. Доступны несколько встроенных плагинов по умолчанию:
  • hangul
  • default (Hunspell)
  • handwriting (T9 Write, Lipi-Toolkit)
  • japanese (OpenWNN)
  • pinyin
  • traditional_chinese
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 следов состоит из следующих виртуальных методов, которые метод ввода должен реализовать, чтобы получить и обработать данные о следе ввода.

  • patternRecognitionModes
  • traceBegin
  • traceEnd

Реализовав эти методы, метод ввода может получать и обрабатывать данные из различных источников ввода (например, раскладки клавиатуры или полноэкранного режима).

Взаимодействие с следом начинается, когда источник ввода обнаруживает новую точку контакта и вызывает метод traceBegin для нового объекта следа. Если метод ввода принимает взаимодействие, он создаёт новый объект следа и возвращает его вызывающей стороне. С этого момента данные следа собираются до вызова метода traceEnd.

Когда вызывается метод traceEnd, метод ввода может начать обработку данных, содержащихся в объекте следа. После обработки данных метод ввода должен уничтожить объект. Это также удаляет след, отображаемый на экране.

Раскладки клавиатуры

Раскладки клавиатуры находятся в каталоге src/virtualkeyboard/content/layouts. Каждый подкаталог каталога раскладки представляет локаль. Каталог локали имеет вид "язык_страна", где язык — это двухбуквенный код языка ISO 639 в нижнем регистре, а страна — двух- или трехбуквенный код страны ISO 3166 в верхнем регистре.

Типы раскладок

Разные типы раскладок клавиатуры используются в разных режимах ввода. По умолчанию используется раскладка "main" для обычного ввода текста. Тип раскладки определяется именем файла раскладки. Таким образом, файл раскладки "main" называется "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 или одного из специализированных типов клавиш. Ниже приведен список всех типов клавиш:

  • Ключ
  • 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"
        }
    }
}

Расчёт размера клавиш

Раскладки клавиатуры масштабируются, что означает, что нельзя устанавливать фиксированные размеры для каких-либо элементов в раскладке. Вместо этого ширина клавиш рассчитывается из веса клавиши относительно друг друга и высоты, деля пространство равномерно между строками клавиатуры.

В приведенном выше примере размер клавиши наследуется от родительских элементов в следующем порядке:

Ключ > 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. Раскладка клавиатуры активируется путем присвоения идентификатора активного компонента свойству 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 для информации о путях импорта 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.12/technical-guide.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API