Qt バーチャルキーボードの概要
特徴
Qt Virtual Keyboard の主な機能は以下の通りです:
- カスタマイズ可能なキーボードレイアウトとスタイル。
- 単語選択によるテキスト予測入力
- 文字プレビューと代替文字表示
- 自動大文字入力とスペース挿入
- さまざまな解像度へのスケーラビリティ
- さまざまな文字セットをサポート(ラテン語、簡体字/繁体字中国語、ヒンディー語、日本語、アラビア語、ヘブライ語、韓国語、その他)。
- ほとんどの一般的な入力言語をサポート。
- 左から右への入力と右から左への入力。
- 2方向および5方向ナビゲーションのためのハードウェアキーのサポート。
- フルスクリーン入力のためのジェスチャーによる手書きサポート。
- 音声フィードバック
- クロスプラットフォーム機能。
- Qt Quick と Qt Widgets の両方のアプリケーションをサポート。
対応言語
Virtual Keyboard は以下の言語をサポートしています:
追加言語のサポートを追加するには、新しいキーボードレイアウトの追加をご覧ください。
サードパーティプラグイン
Qt Virtual Keyboard は、以下のベンダーのサードパーティプラグインをサポートしています:
- Cerence XT9アドバンスト入力
- CerenceXT9 高度入力Cerence 手書きテキスト入力
- MyScriptText 手書き認識
これらのプラグインを QtVirtualKeyboard に統合する方法について説明します。
基本コンセプト
Qt Virtual Keyboard プロジェクトは Qt 入力コンテキストプラグインで、QPlatformInputContextPlugin と QPlatformInputContext インターフェイスを実装しています。これらのインターフェースにより、プラグインを Qt アプリケーションのプラットフォーム入力コンテキストプラグインとして使用することができます。
プラグイン自体は、複数の入力メソッドをサポートする入力フレームワークと、仮想キーボード用の QML UI を提供します。入力フレームワークはプラグイン・インターフェイスによって拡張可能であり、サードパーティの入力メソッドやキーボード・レイアウトを実行時に読み込むことができます。
入力フレームワークは以下の主要なインターフェースを提供します:
- QVirtualKeyboardInputContext仮想キーボードと他の入力コンポーネントのコンテキスト情報を提供する。基礎となるテキスト入力コンポーネントへのインターフェースとして機能する。
- QVirtualKeyboardInputEngineユーザー入力イベント(キー押下など)を統合するAPIを公開し、入力メソッドのホストとして機能する。
- QVirtualKeyboardAbstractInputMethodC++ ベースの入力メソッドの基本型。入力メソッドは通常キーイベントを扱いますが、マウスやタッチ入力イベントも扱うことができます。
- InputMethodQML ベースの入力メソッドの基本型。input メソッドは通常キーイベントを扱いますが、 マウスやタッチ入力イベントも扱うことができます。
入力コンテキスト
入力コンテキストはキーボードや具体的な入力メソッドで使われます。InputContext はQMLがホストするシングルトンインスタンスです。アプリケーションは入力コンテキストを直接操作すべきではありません。
コンテキスト情報
入力コンテキストはアプリケーションに由来するコンテキスト情報へのアクセスを提供します。この情報には以下が含まれるが、これらに限定されるものではない:
- InputContext::cursorPosition
- InputContext::cursorRectangle
- InputContext::inputMethodHints
- InputContext::preeditText
- InputContext::selectedText
- InputContext::surroundingText
ロケール
仮想キーボードエンジンは、layouts/
にあるロケール固有のレイアウトディレクトリから、サポートされるロケールのリストを生成します。各レイアウトディレクトリには、ダイヤルパッド、数字、手書き、メイン、数字、記号の各レイアウトタイプの定義またはフォールバックが含まれていなければなりません。定義は.qml
ファイルで実装され、フォールバックは.fallback
ファイル拡張子のプレースホルダファイルで定義されます。layouts/
ディレクトリには、各レイアウト・タイプの定義を含むfallback/
サブディレクトリが含まれていなければなりません。
各レイアウト・ディレクトリには、1つまたは複数のレイアウト・タイプの定義を含めることができる。ロケール固有のレイアウトがフォールバックロケールのレイアウトと同じである場合、<layout type>.fallback
というレイアウト用のプレースホルダーファイルを追加できます。これは仮想キーボードにフォールバックレイアウトを使うように指示します。
例えば、フィンランド語のロケール固有のレイアウトを追加し、main.qml
にメインレイアウトタイプを定義することができます。他のレイアウトタイプについては、フォールバックメカニズムを選択します。あなたのlayouts/
ツリーはこのようになります:
. ├── fallback │ ├── dialpad.qml │ ├── digits.qml │ ├── handwriting.qml │ ├── main.qml │ ├── numbers.qml │ └── symbols.qml └── fi_FI ├── dialpad.fallback ├── digits.fallback ├── handwriting.fallback ├── main.qml ├── numbers.fallback └── symbols.fallback
layouts/fallback
ディレクトリには、常に完全な実装ファイル一式を含めることが必須です。
アプリケーションはデフォルトのロケールを変更することで、初期レイアウトを指定することができます。しかし、これはアプリケーションが初期化され、入力メソッドプラグインがロードされる前に行われなければなりません。デフォルトのロケールに変更がない場合は、現在のシステムロケールが使用されます。
キーボードのロケールとの照合は、次の順序で行います:
layouts/<language>_<country>
layouts/<language>_*
layouts/fallback
- ここでのデフォルトレイアウトはen_GB です。
まず、ロケールを完全なロケール名と照合します。完全一致しない場合は、ロケール言語のみが一致する。最後に、layouts/fallback
の内容がフォールバックとして使用されます。
ロケールの選択が終わると、キーボードは入力ロケールと入力方向を現在のレイアウトに合わせて更新します。アプリケーションはこの情報をQInputMethod 。
内部的には、現在の入力ロケールもQVirtualKeyboardInputEngine 、現在の入力メソッドのインスタンスも更新される。
入力エンジン
入力エンジン・オブジェクトはInputContext によって所有されます。InputContext QVirtualKeyboardInputEngine入力エンジンは、キーボードがキー押下やキー離しイベントなどのユーザーインタラクションを入力メソッドにマッピングするために使用するAPI関数を含んでいます。
例えば、仮想キーボードのキーイベントは、以下のメソッドを通じてマッピングされます:
上記のメソッドは仮想キーボードの統合を目的としているため、メソッド名に "仮想 "という言葉が使われています。つまり、これらのメソッドは物理的なキーストロークのマッピングには適していません。これは、実際のアクションはキーが離されたときにのみ実行されるという事実の結果です。
キーが離される前にキー入力が中断された場合、キーボードはQVirtualKeyboardInputEngine::virtualKeyCancel メソッドを呼び出します。
入力メソッド
inputメソッドは、キー・プレス・ハンドラの具体的な実装である。主な機能は、キー押下イベントを処理し、ユーザー入力の状態情報を保持することです。このメソッドは、QVirtualKeyboardInputContext 、編集前のテキストやキーイベントを介してテキストエディタと対話します。
入力メソッド・インスタンスは、ユースケースに応じてさまざまな方法で作成できます:
KeyboardLayout::inputMethod
キーボードレイアウトは、そのキーボードレイアウト専用の入力メソッドインスタンスを作成することができます。キーボードレイアウトが変更されると、このインスタンスは破棄されることに注意すべきである。したがって、この方法は通常、非常に狭いユースケースに限定されます。KeyboardLayout::createInputMethod()
キーボードレイアウトは、このレイアウトとshared layouts (シンボルレイアウトなど)で使用できる入力メソッドを動的に作成することができます。これは、複雑な言語や手書き文字など、特殊な入力メソッドを作成するのに適した方法です。DefaultInputMethod
仮想キーボードは起動時にこのタイプの入力メソッドの作成を試みます。このインスタンスは、キーボードレイアウトがカスタム入力メソッドを使用しない限り、すべてのキーボードレイアウトでデフォルトの入力メソッドとして使用されます。このインスタンスは言語間でのキーボードレイアウトの変更よりも長持ちし、デフォルトの入力メソッドを作成したり上書きしたりするのに適した方法です。
仮想キーボード・プラグイン
仮想キーボードのsrc/pluginsディレクトリには、仮想キーボードの既存のプラグインが含まれています。これらのプラグインはQtQuick.VirtualKeyboard.Plugins QMLモジュールによって暗黙的にロードされる標準的なQMLモジュールです。
プラグインはキーボードレイアウトと入力メソッド(通常は両方)を提供します。仮想キーボードが使用する入力メソッドは、どのキーボードレイアウトが使用されているかに依存します。キーボードレイアウトはKeyboardLayout.createInputMethod()関数によってカスタム入力メソッドのインスタンスを提供することができます。そうでない場合は、仮想キーボードが作成したデフォルトの入力メソッド(DefaultInputMethod)が使用されます。
キーボードレイアウトの追加
プラグインは、レイアウトファイルをプラグイン・バイナリのQtリソースに含めることで、仮想キーボードにキーボード・レイアウトを追加することができます。
仮想キーボードは、特定のパス/qt-project.org/imports/QtQuick/VirtualKeyboard/Layouts/<language_COUNTRY> からキーボードレイアウトを探します。Qt リソースのパスはオーバーラップする可能性があり、プラグインが仮想キーボード上の既存のレイアウトを上書きできることを意味します。
また、QT_VIRTUALKEYBOARD_LAYOUT_PATH環境変数を使用することで、ファイルシステムから直接読み込んで、組み込みのキーボードレイアウトを上書きすることも可能です。
入力メソッドの追加
プラグインは、他のキーボードレイアウトがデフォルトで使用できる入力メソッド(DefaultInputMethod
など)、またはプラグイン内で個人的に使用する入力メソッド(入力メソッドを作成するカスタムキーボードレイアウトも提供する)を登録できます。
入力メソッドはQVirtualKeyboardAbstractInputMethod (C++)またはInputMethod (QML)インターフェイスを実装し、プラグインによってQML型(QML_NAMED_ELEMENT )として登録されなければなりません。
カスタム入力メソッドの実装
入力メソッドの実装は、まず QML と C++ のどちらのインターフェースを使うかを決めるところから始まります。この例では QML インターフェースを使用します。C++ インタフェースQVirtualKeyboardAbstractInputMethod を使用する場合も、同じ論理とインタフェースが適用されます。この場合、プラグインはVirtualKeyboardモジュールにリンクする必要があります。
次の例は入力メソッドに最低限必要な機能を示しています:
// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtQuick.VirtualKeyboard // file: CustomInputMethod.qml InputMethod { function inputModes(locale) { return [InputEngine.InputMode.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
を返す。そうでない場合、キー入力はデフォルトの入力メソッドで処理されます。
選択リスト
選択リストは、入力メソッドに組み込むことができるオプション機能です。入力フレームワークは、単語候補リストのようなさまざまなタイプのリストをサポートしています。リストを実装する際の責任は、入力メソッドがコンテンツとクリック動作などのアクティビティに責任を持つように処理されます。入力フレームワークはリスト・モデルの維持とユーザー・インターフェースへの配信を担当します。
選択リストの割り当て
選択リストは、inputメソッドがアクティブになったときに割り当てられます。InputMethod::selectionLists() メソッドは、必要な選択リスト・タイプのリストを返します:
function selectionLists() { return [SelectionListModel.Type.WordCandidateList]; }
上記の例では、inputメソッドは単語候補リストを割り当てます。
選択リストの更新
入力メソッドがUIに選択リストの内容を更新するように要求すると、InputMethod::selectionListChanged シグナルを発します。同様に、入力メソッドがUIにリスト内の項目をハイライトするように要求する場合、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 は、表示テキスト・データを要求します。
ユーザーアクションへの応答
ユーザーがリストの項目を選択すると、input メソッドはInputMethod::selectionListItemSelected メソッドのコールバックでそのイベントに応答します。
function selectionListItemSelected(type, index) { if (type == SelectionListModel.Type.WordCandidateList) { inputContext.commit(wordlist[index]) update() } }
手書き認識の統合
入力メソッドは、タッチスクリーンやその他の入力デバイスからの入力データを使用することもできます。
入力が始まると、仮想キーボードは入力メソッド関数 traceBegin を呼び出します。この関数は、入力メソッドに代わって、入力が収集される新しいTrace オブジェクトを返します。同様に、指やスタイラスが上げられると、 traceEnd の呼び出しでイベントが終了する。入力メソッドは収集されたデータを処理し、InputContext インタフェースを使用してテキストを生成する。
手書き用の定義済みキーボード・レイアウトがあります。しかし、それらはデフォルトでは含まれておらず、手書きプラグインは独自のリソースにそれらを含める必要があります。その方法については、MyScriptまたはCerence の既存の手書き用プラグインを参照してください。
手書き入力のデータモデル
Virtual keyboard は、手書きデータを特別なデータモデルQVirtualKeyboardTrace に収集します。各トレースは、1 回のタッチ (画面のスワイプなど) からサンプリングされたデータのコレクションを表します。QVirtualKeyboardTrace のインスタンスは、手書き入力エリアのタッチの数だけ存在します。
定義上、トレースは1回のタッチからサンプリングされたデータの集合です。基本的なポイントデータに加えて、各ポイントの時間など、他のタイプのデータを含めることもできます。入力メソッドは、トレースイベントの開始時に希望する入力チャンネルを定義することができる。
入力メソッドは、トレースデータの実際の収集には関与しない。しかし、入力メソッドは、QVirtualKeyboardTrace (処理するインスタンスが多すぎる場合など)を受け入れるか拒否することができるため、入力を完全に制御することができる。これはまた、同時に使用できる指の数を正確に制御することもできる。
入力メソッドは、適切と思われるだけのトレースを収集することができ、必要なときに処理を開始することができる。データをサンプリングしながら並行して処理を行うこともできるが、パフォーマンスの問題が発生する可能性があるため推奨されない。推奨されるのは、最後の入力から適切な遅延をおいてバックグラウンド・スレッドで処理を開始する方法である。
入力メソッドのトレースAPI
トレース API は以下の仮想メソッドで構成され、入力メソッドはトレース入力データを受け取って処理するために実装する必要があります。
これらのメソッドを実装することで、入力メソッドは様々な入力ソース(キーボードレイアウトやフルスクリーンなど)からデータを受け取り、処理することができます。
patternRecognitionModesメソッドは、入力メソッドがサポートするパターン認識モードのリストを返す。 Handwriting のようなパターン認識モードは、入力メソッドがデータを処理する方法を定義する。
トレース・インタラクションは、入力ソースが新しいコンタクト・ポイントを検出し、新しいトレース・ オブジェクトのために traceBegin メソッドを呼び出すと開始される。入力メソッドがインタラクションを受け入れると、新しいトレースオブジェクトを作成し、呼び出し元に返します。この時点から、traceEnd メソッドが呼び出されるまで、トレースデータが収集される。
traceEnd メソッドが呼ばれると、入力メソッドはトレースオブジェクトに含まれるデータの処理を開始することができる。データを処理した後、入力メソッドはオブジェクトを破棄しなければならない。これにより、スクリーンにレンダリングされたトレースも削除されます。
キーボードレイアウト
キーボードレイアウトはsrc/layouts/builtinディレクトリにあります。レイアウトディレクトリの各サブディレクトリはロケールを表します。localeディレクトリは "language_country "という形式の文字列で、languageは小文字の2文字のISO 639言語コード、countryは大文字の2文字または3文字のISO 3166国コードです。
レイアウトの種類
異なるキーボードレイアウトタイプは異なる入力モードで使用されます。通常のテキスト入力に使われるデフォルトのレイアウトは「メイン」レイアウトと呼ばれます。レイアウトの種類はレイアウトファイル名によって決まります。したがって、"main "レイアウトファイルは "main.qml "と呼ばれます。
サポートされているレイアウト・タイプのリスト:
main
通常のテキスト入力用のメインレイアウトsymbols
特殊文字などのためのシンボルレイアウト(メインレイアウトから有効になります)numbers
フォーマットされた数字用の数字レイアウト( で有効化)Qt::ImhFormattedNumbersOnlydigits
数字のみのレイアウト( で有効化)Qt::ImhDigitsOnlydialpad
電話番号入力用ダイヤルパッドレイアウト( で起動)Qt::ImhDialableCharactersOnlyhandwriting
手書き認識用の手書きレイアウト (メインレイアウトから起動)
新しいキーボードレイアウトの追加
キーボードレイアウトエレメントはKeyboardLayout QMLタイプに基づいていなければなりません。このタイプはレイアウトのルートアイテムを定義します。ルートアイテムには以下のオプションプロパティがあり、必要に応じて設定することができます:
property var inputMethod | このレイアウトの入力メソッドを指定します。入力メソッドが定義されていない場合、現在の入力メソッドが使用されます。 |
property int inputMode | このレイアウトの入力モードを指定します。 |
property real keyWeight | このキーボード・レイアウトのすべてのキーに使われるデフォルトのキーウェイトを指定します。キーの太さは比例値で、個々のキーの大きさに影響します。 |
キーボードレイアウトに新しい行を追加するには、KeyboardRow タイプを使用します。KeyboardRow 、その子要素にデフォルトのキーウェイトを指定することもできる。そうでない場合、キーウェイトは親要素から継承されます。
新しいキーは、キー・タイプまたは特殊なキー・タイプの1つを使ってキーボード行に追加されます。以下はすべてのキー・タイプのリストです:
キーボードレイアウト用のBackspaceキー | |
言語変更キー(キーボードレイアウト用 | |
キーボードレイアウト用のEnterキー | |
キーボードレイアウト用Fillerキー | |
キーボードレイアウト用フリックキー | |
キーボードレイアウト用手書きモードキー | |
キーボードレイアウト用Hideキー | |
キーボードレイアウト用入力モードキー | |
キーボードレイアウト用常用漢字キー | |
キーボードレイアウト用汎用モードキー | |
キーボードレイアウト用特殊数字キー | |
キーボードレイアウト用Shiftキー | |
キーボードレイアウト用スペースキー | |
キーボードレイアウト用記号モードキー | |
タッチ入力データを収集するための専用キー |
例えば、入力メソッドにキーイベントを送信する通常のキーを追加する:
import QtQuick import QtQuick.VirtualKeyboard import QtQuick.VirtualKeyboard.Components // file: en_GB/main.qml KeyboardLayout { keyWeight: 160 KeyboardRow { Key { key: Qt.Key_Q text: "q" } } }
キーサイズの計算
キーボードレイアウトはスケーラブルであるため、レイアウト内のアイテムに固定サイズを設定することはできません。その代わり、キーの幅はキーの重さから計算され、高さはキーボードの行を均等に分割することで計算されます。
上の例では、キーのサイズは親要素から次の順序で継承されます:
キー >KeyboardRow >KeyboardLayout
キーウェイトの実効値は160になります。この例では、カスタムキーの重さを指定するキーをもう1つ追加します:
import QtQuick import QtQuick.VirtualKeyboard import QtQuick.VirtualKeyboard.Components // file: en_GB/main.qml KeyboardLayout { keyWeight: 160 KeyboardRow { Key { key: Qt.Key_Q text: "q" } Key { key: Qt.Key_W text: "w" keyWeight: 200 } } }
これで1行のキーウェイトの合計は160 + 200 = 360となります。キーボードレイアウトを有効にすると、個々のキーの幅は次のように計算されます:
キーの幅(ピクセル) = キーの重さ / SUM(行のキーの重さ) * 行の幅(ピクセル
つまり、キーボードはどんなサイズにも拡大縮小でき、相対的なキーのサイズは変わりません。
代替キー
KeyにはalternativeKeysプロパティを指定することができ、ユーザーがキーを長押しすると、代替キーの一覧がポップアップで表示されます。alternativeKeysには、文字列または文字列のリストを指定できます。alternativeKeysが文字列の場合、ユーザーは文字列内の文字を選択することができます。
スタイルとレイアウト
キーボード・レイアウトは視覚的要素を指定することはできません。代わりに、レイアウトはキーボード・スタイルによって視覚化されます。一方、キーボード・スタイルはキーボード・レイアウトのサイズに影響を与えることはできません。
複数ページのキーを持つキーボード レイアウト
シンボルレイアウトなどの一部のキーボードレイアウトには、1つのキーボードレイアウトで表示可能な数よりも多くのキーが含まれている場合があります。その解決策として、KeyboardLayoutLoader を使って複数のキーボードレイアウトを同じコンテキストに埋め込む方法があります。
KeyboardLayoutLoader をキーボードレイアウトのルートアイテムとして使用する場合、実際のキーボードレイアウトは Component 要素の中にラップされます。キーボードレイアウトは、アクティブなコンポーネントのidをsourceComponentプロパティに代入することでアクティブになります。
例えば
import QtQuick import QtQuick.VirtualKeyboard import QtQuick.VirtualKeyboard.Components // file: 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リソースとしてプラグインバイナリに埋め込まれます。カスタムレイアウトはファイルシステムに配置され、仮想キーボード自体を再コンパイルすることなくインストールできます。
実行時のレイアウト選択は環境変数QT_VIRTUALKEYBOARD_LAYOUT_PATH
の影響を受けます。
環境変数が設定されていないか、無効なディレクトリが含まれている場合、仮想キーボードはデフォルトのビルトイン・レイアウトにフォールバックします。
カスタムレイアウトを使用しているときにビルトインレイアウトが仮想キーボードプラグインに組み込まれないようにするには、configure
スクリプトに-no-vkb-layouts
オプションを追加します。詳細については、設定オプションを参照してください。
キーボードスタイル
仮想キーボード・スタイル・システムは、カスタム・スタイルだけでなくビルトイン・スタイルもサポートしています。ビルトイン・スタイルはQtリソースとしてプラグイン・バイナリに埋め込まれ、カスタム・スタイルはファイルシステムにあり、仮想キーボード自体を再コンパイルすることなくインストールできます。
実行時のスタイルの選択は、環境変数 QT_VIRTUALKEYBOARD_STYLE に影響されます。この環境変数には、組み込みスタイルの名前、例えば "retro" や、Styles ディレクトリにインストールされているカスタムスタイルの名前を設定することができます:
$$[QT_INSTALL_QML]/QtQuick/VirtualKeyboard/Styles
環境変数が設定されていないか、無効なスタイル名が含まれている場合、仮想キーボードはデフォルトの組み込みスタイルに戻ります。
カスタムスタイルの追加
新しいスタイルの作成は、URLベースのディレクトリ構造QtQuick/VirtualKeyboard/Styles/ の下にあるQMLインポートパスにスタイル用の新しいサブディレクトリを作成することから始まります。QMLインポートパスについては、「QMLインポートパス」を参照してください。ディレクトリ名にはスペースやアンダースコア以外の特殊文字を含めることはできません。また、ディレクトリ名には、組み込みスタイル(現在のところ "default "と "retro "を含む)のいずれかと同じものを使用することはできません。
新しいスタイルを作成するための良い出発点は、既存の組み込みスタイルをテンプレートとして使用し、それを編集することです。組み込みスタイルは、仮想キーボードのソース・ディレクトリsrc/styles/builtinから見つけることができます。組み込みスタイルを含むディレクトリの1つを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
QQuickWidgetでQt Virtual Keyboardを使う
タッチデバイスのQQuickWidget で Qt Virtual Keyboard を使用する場合、QWidget::setAttribute() でQt::WA_AcceptTouchEvents 属性を設定する必要があります。この属性が設定されていないと、タッチデバイスからのイベントは合成されたマウスイベントに変換されます。
©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。