Spec-Zone.ru › Qt 5.15

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

Обзор

Данный документ предоставляет технический обзор плагина 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.fallback
  • digits.fallback
  • main.fallback
  • numbers.fallback
  • symbols.fallback

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

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

  • layouts/<язык>_<страна>
  • layouts/<язык>_*
  • 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}.

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

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

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.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"
        }
    }
}

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

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

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

Клавиша > 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.15/technical-guide.html

Spec-Zone.ru

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