右から左へのユーザーインターフェース

概要

この章では、Qt Quick アプリケーションに右から左への言語サポートを実装するためのさまざまなアプローチとオプションについて説明します。一般的な右から左への言語には、アラビア語、ヘブライ語、ペルシア語、ウルドゥー語などがあります。ほとんどの変更点には、右から左の言語に翻訳されたテキストが適切に右寄せになるようにすることと、ビュー、リスト、グリッドで水平に並べられたコンテンツが右から左に正しく流れるようにすることが含まれます。

右から左の言語を話す文化圏では、人々は自然にグラフィック要素やテキストを右から左にスキャンして読みます。一般的な経験則では、コンテンツ(写真、ビデオ、地図など)はミラーリングされませんが、コンテンツの配置(アプリケーションのレイアウトや視覚的要素の流れなど)はミラーリングされます。例えば、時系列で表示される写真は右から左に流れ、水平スライダーの下端範囲はスライダーの右側に位置し、テキスト行は使用可能なテキストエリアの右側に揃える。ビジュアル要素の位置がコンテンツに関連している場合、例えば地図上の位置を示すポジションマーカーが表示されている場合など、位置はミラーリングされるべきではありません。また、右から左へ話す言語話者が左から右への配置に慣れている場合、例えば電話のナンバーダイヤラーや音楽プレーヤーのメディア再生・一時停止・巻き戻し・送りボタンを使う場合など、特別なケースを考慮する必要があるかもしれません。

テキストの配置

(これは、TextTextInputTextEdit タイプに適用されます)。

テキストアイテムの水平方向の配置が明示的に設定されていない場合、テキスト要素はテキストの自然な読み方向に自動的に配置されます。デフォルトでは、英語のような左から右へのテキストはテキストエリアの左側に揃えられ、アラビア語のような右から左へのテキストはテキストエリアの右側に揃えられます。空白テキス ト を持つテキス ト 要素の整列は、QInputMethod::inputDirection () を手がかり と し ます。

このデフォルトのロケールに基づく配置は、テキスト要素にhorizontalAlignment プロパティを設定するか、LayoutMirroring attached プロパティを用いてレイアウトミラーリングを有効にすることで上書きすることができます。LayoutMirroring が設定されている場合、horizontalAlignment プロパティの値は変更されないことに注意してください。ミラーリングを考慮したテキスト要素の有効な配置は、effectiveHorizontalAlignment プロパティから読み取ることができます。

// automatically aligned to the left
Text {
    text: "Phone"
    width: 200
}

// automatically aligned to the right
Text {
    text: "خامل"
    width: 200
}

// aligned to the left
Text {
    text: "خامل"
    horizontalAlignment: Text.AlignLeft
    width: 200
}

// aligned to the right
Text {
    text: "خامل"
    horizontalAlignment: Text.AlignLeft
    LayoutMirroring.enabled: true
    width: 200
}

ポジショナーとビューのレイアウト方向

(これは、RowGridFlowListViewGridView タイプに適用されます)。

水平ポジショニングとモデルビューに使用されるタイプには、レイアウトの水平方向を制御するためのlayoutDirection プロパティがあります。layoutDirectionQt.RightToLeft に設定すると、アイテムは右から左にレイアウトされます。デフォルトでは、Qt Quick は左から右へのレイアウトに従います。

水平方向のレイアウト方向は、LayoutMirroring 添付プロパティによって逆にすることもできます。これにより、ポジショナーとビューの有効なlayoutDirection が反転します。layoutDirection プロパティの実際の値は変更されないことに注意してください。ミラーリングを考慮したポジショナーとビューの有効なレイアウト方向は、effectiveLayoutDirection プロパティから読み取ることができます。

// by default child items are positioned from left to right
Row {
    Child {}
    Child {}
}

// position child items from right to left
Row {
    layoutDirection: Qt.RightToLeft
    Child {}
    Child {}
}

// position child items from left to right
Row {
    LayoutMirroring.enabled: true
    layoutDirection: Qt.RightToLeft
    Child {}
    Child {}
}

レイアウトミラーリング

添付のプロパティLayoutMirroring は、既存の左から右への Qt Quick アプリケーションに右から左へのサポートを簡単に実装するための便宜として提供されています。これは、アイテムアンカーの動作、ポジショナーや モデルビューのレイアウト方向、QML テキストタイプの明示的なテキスト配置を反映します。

特定のItem に対してレイアウトミラーリングを有効にすることができます:

Item {
    height: 50; width: 150

    LayoutMirroring.enabled: true
    anchors.left: parent.left   // anchor left becomes right

    Row {
        // items flow from left to right (as per default)
        Child {}
        Child {}
        Child {}
    }
}

または、すべての子タイプもレイアウト方向を継承するように設定します:

Item {
    height: 50; width: 150

    LayoutMirroring.enabled: true
    LayoutMirroring.childrenInherit: true
    anchors.left: parent.left   // anchor left becomes right

    Row {
        // setting childrenInherit in the parent causes these
        // items to flow from right to left instead
        Child {}
        Child {}
        Child {}
    }
}

この方法でミラーリングを適用しても、関連するアンカー、layoutDirectionhorizontalAlignment プロパティの実際の値は変わりません。別の読み取り専用プロパティeffectiveLayoutDirection は、ミラーリングを考慮したポジショナーやモデルビューの有効なレイアウト方向を問い合わせるために使用することができます。同様に、TextTextInputTextEdit タイプは、テキストの効果的なビジュアルアライメントを問い合わせるためのリードオンリープロパティeffectiveHorizontalAlignment を得ています。

アンカーやポジショナ型ではなく)x プロパティ値を使用して定義されたアプリケーションレイアウトやアニメーションは、LayoutMirroring 添付プロパティの影響を受けないことに注意してください。したがって、これらのタイプのレイアウトに右から左へのサポートを追加するには、特にアンカーとx座標ベースの位置決めの両方に依存しているビューでは、アプリケーションにいくつかのコード変更が必要になる場合があります。ここでは、LayoutMirroring attached プロパティを使用して、x 座標を使用して配置されているアイテムにミラーリングを適用する 1 つの方法を示します:

Rectangle {
    color: "black"
    height: 50; width: 50
    x: mirror(10)
    function mirror(value) {
        return LayoutMirroring.enabled ? (parent.width - width - value) : value;
    }
}

すべてのレイアウトが必ずしもミラーリングされるべきではありません。ほとんどの人は右利きなので、片手での使いやすさを向上させるためにビジュアルタイプを画面の右側に配置する場合があります。子タイプがミラーリングの影響を受けないようにするには、そのタイプのLayoutMirroring.enabled プロパティを false に設定します。

Qt Quick は、アニメーションする流動的なユーザーインターフェースを開発するために設計されています。アプリケーションをミラーリングするときは、アニメーションとトランジションが期待通りに動作するかテストすることを忘れないでください。アプリケーションに右から左へのサポートを追加するリソースがない場合は、アプリケーションのレイアウトを左揃えのままにしておき、テキストが適切に翻訳され配置されていることを確認する方がよいでしょう。

アイコンのミラーリング

(これはImageBorderImageAnimatedImage のタイプに適用されます)。

ほとんどの画像はミラーリングする必要はありませんが、矢印のような方向性のあるアイコンはミラーリングが必要な場合があります。これらのアイコンの描画は、専用のmirror プロパティでミラーリングすることができます:

Image {
    source: "arrow.png"
    mirror: true
}

デフォルトのレイアウト方向

アプリケーションのアクティブなレイアウト方向を問い合わせるには、Qt.application.layoutDirection プロパティを使用します。このプロパティはQGuiApplication::layoutDirection() を継承しており、アクティブな言語翻訳ファイルからレイアウト方向を決定します。

特定のロケールのレイアウト方向を定義するには、QGuiApplication コンテキスト内の専用文字列リテラルQT_LAYOUT_DIRECTION を、LTR またはRTL のいずれかとして宣言します。

まず、この行をQMLソースコードのどこかに記述してください:

qsTr("QT_LAYOUT_DIRECTION","QGuiApplication");

次に、Using lupdateを使って翻訳ソースファイルを生成します。

これにより、次の宣言が翻訳ファイルに追加されます。ここで、ロケールの翻訳として、LTR またはRTL を入力することができます。

<context>
    <name>QGuiApplication</name>
    <message>
        <location filename="myapp.qml" line="33"/>
        <source>QT_LAYOUT_DIRECTION</source>
        <translation type="unfinished">RTL</translation>
    </message>
</context>

次に、アプリケーションのルートQMLコンポーネントに以下のバインディングを追加します:

LayoutMirroring.enabled: Qt.application.layoutDirection === Qt.RightToLeft
LayoutMirroring.childrenInherit: true

最初のバインディングは、右から左へのロケールが設定されたときにUIが適切にミラーリングされるようにするものです。2つ目のバインディングは、ルートコンポーネントの子アイテムもミラーリングに対応するようにします。

コンパイルした翻訳ファイルを使用して Qt Quick アプリケーションを実行することで、レイアウト方向が期待通りに動作することをテストできます:

qml myapp.qml -translation myapp.qm

スタティック関数QGuiApplication::setLayoutDirection() を呼び出すことで、右から左へのレイアウト方向でアプリケーションをテストすることができます:

QGuiApplication app(argc, argv);
app.setLayoutDirection(Qt::RightToLeft);

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。