Qtクイックレイアウトの概要

Qt Quick Layouts を使って、ユーザーインターフェースのアイテムを配置します。Qt クイックレイアウトはアイテムのサイズを変更できるので、リサイズ可能なユーザーインターフェイスに適しています。

主な機能

Qt Quick Layouts の主な機能は以下の通りです:

さらに、GridLayout には以下の機能が追加されています:

はじめに

Qt Quick Layouts を使い始めるには、.qml ファイルに以下の import 文を記述して、QML タイプをアプリケーションにインポートしてください:

import QtQuick.Layouts

次のステップは、簡単なレイアウトを作成することです。Qt Quick Layouts - Basic Exampleも参考にしてください。

簡単なレイアウト

レイアウトを使用する意図は、レイアウトのサイズが変更されるたびに子レイアウトを再配置することです。つまり、アプリケーションはレイアウトのサイズを確実に変更する必要があります。以下のスニペットでは、RowLayoutに anchors.fill: parent を指定することで、これを保証しています。しかし、widthheight プロパティを指定するなど、他の方法でもこれを実現できます。同じスニペットでは、オレンジのRectangleは 100x150ピクセルで固定されており、プラムのRectangleは割り当てられたすべてのスペースを占めるように拡大します。

Window {
    RowLayout {
        anchors.fill: parent
        spacing: 6
        Rectangle {
            color: 'azure'
            Layout.preferredWidth: 100
            Layout.preferredHeight: 150
        }
        Rectangle {
            color: "plum"
            Layout.fillWidth: true
            Layout.fillHeight: true
        }
    }
}

レイアウトは子プロパティのジオメトリを管理します。これには、widthheightxyanchors などのプロパティが含まれます。

重要です: アプリケーションの子アイテムのジオメトリに影響を与えるプロパティを指定しないでください。子アイテムにこれらのプロパティを設定すると、競合が発生し、結果は未定義になります。これは、子アイテムがレイアウトである場合にも当てはまります。したがって、親レイアウトを持たないレイアウトだけがanchors.fill: parent を持つことができます。

スペーシング

前のスニペットで見たように、RowLayoutの スペーシングは 6に設定されています。これにより、レイアウト内のすべてのアイテムの間隔が6ピクセルになります:

spacing: 6

スペーシング値の指定を省略した場合、レイアウトはデフォルトの5ピクセルを使用します。スペーシング値の指定を省略した場合、レイアウトはデフォルトの5ピクセルを使用します。スペーシングは、子アイテムのimplicitWidthと同様に、レイアウトのimplicitWidthに寄与します。デフォルトの動作に依存している場合、レイアウトデザインに影響を与える可能性があるため、この点に留意することが重要です。例えば、2つの ColumnLayoutは両方ともLayout.fillWidth: trueを設定しています。どちらも同じ幅になると考えるのは自然です。しかし、内側のRowLayoutのアイテム間のデフォルトの間隔が5ピクセルであるため、最初のColumnLayoutの implicitWidthが大きくなり、2番目のColumnLayoutのためのスペースが少なくなります。例えば

ApplicationWindow {
    id: root
    width: 300
    height: 300
    visible: true

    RowLayout {
        anchors.fill: parent
        ColumnLayout {
            Rectangle {
                color: "tomato";
                Layout.fillWidth: true
                Layout.fillHeight: true
            }
            RowLayout {
                Rectangle {
                    color: "navajowhite"
                    Layout.fillWidth: true
                    Layout.fillHeight: true
                }
                Rectangle {
                    color: "darkseagreen"
                    Layout.fillWidth: true
                    Layout.fillHeight: true
                }
            }
        }
        ColumnLayout {
            Rectangle {
                color: "lightpink"
                Layout.fillWidth: true
                Layout.fillHeight: true
            }
            Rectangle {
                color: "slategray"
                Layout.fillWidth: true
                Layout.fillHeight: true
            }
            Rectangle {
                color: "lightskyblue"
                Layout.fillWidth: true
                Layout.fillHeight: true
            }
        }
    }
}

このスニペットは次のようなレイアウトを生成します:

"A QML layout with default spacing"

この2つのカラムの大きさを等しくするには、次のようにします。

  1. RowLayoutのスペーシングを0 、または
  2. の両方でpreferredWidthを等しい値に設定します。 ColumnLayouts.

優先サイズの指定

各項目について、有効な優先サイズはいくつかの候補プロパティのうちの一つから得ることができる。有効な優先サイズを決定するために、項目はこれらの候補プロパティを以下の順序で問い合わせ、有効な幅または高さを持つ最初の候補を使用する。

候補プロパティ説明
Layout.preferredWidth またはLayout.preferredHeightこ れ ら のプ ロ パテ ィ は、 デフ ォ ル ト の暗黙のサ イ ズが最適な配置を与え ない と き に、 アプ リ ケーシ ョ ンが変更す る こ と を想定 し てい ます。
implicitWidth または 。implicitHeightこれらのプロパティは、意味のある理想的なサイズを与えるために、各項目によって提供されることになっています。例えば、Text 型のすべての内容を表示するのに必要なサイズ。0 の暗黙の幅または高さは無効と解釈されます。

項目は、Layout.preferredHeight を指定しなくてもLayout.preferredWidth を指定することができます。こ の よ う な場合、 有効な優先高 さ はimplicitHeight から決定 さ れます。

注: preferredWidth も implicitWidth も指定 し ない と 、 レ イ ア ウ ト はwidth を有効優先幅の最終値 と し て取得 し ます。し か し 、width を有効優先幅の情報源 と し て信頼すべきではない。例えば、widthheight のプロパティを変更しても、レイアウトの再配置は行われません。また、完全な再構築を強制された場合、レイアウトはQMLファイルで指定された幅と高さではなく、実際の幅と高さを使用するかもしれません。

サイズ制約

アイテムはレイアウトによってサイズを変更することができるため、レイアウトはLayout.fillWidth またはLayout.fillHeighttrue に設定されているすべてのアイテムのminimum,preferred,maximum のサイズを知る必要があります。

preferred の幅と高さは、レイアウト自体が特定のサイズに束縛されていない場合、アイテムの実際の幅と高さです。レイアウトが特定のサイズに設定されている場合、最小サイズと最大サイズを考慮しながら、アイテムの優先サイズの比率に基づいて追加のスペースを分配します。すべてのアイテムがfillWidthと fillHeightを設定するとき、好ましいサイズと暗黙のサイズは比率と重みとして機能します。

たとえば、次のようにすると、2つの長方形が横に並んだレイアウトが作成されます。オレンジの長方形は50x150から300x150に、プラムの長方形は100x100から∞x100にサイズを変更できます。各アイテムの最小幅と最大幅を超えない限り、プラムの長方形の幅はオレンジの長方形の2倍になります。

RowLayout {
    id: layout
    anchors.fill: parent
    spacing: 6
    Rectangle {
        color: 'orange'
        Layout.fillWidth: true
        Layout.minimumWidth: 50
        Layout.preferredWidth: 100
        Layout.maximumWidth: 300
        Layout.minimumHeight: 150
        Text {
            anchors.centerIn: parent
            text: parent.width + 'x' + parent.height
        }
    }
    Rectangle {
        color: 'plum'
        Layout.fillWidth: true
        Layout.minimumWidth: 100
        Layout.preferredWidth: 200
        Layout.preferredHeight: 100
        Text {
            anchors.centerIn: parent
            text: parent.width + 'x' + parent.height
        }
    }
}

"RowLayout at its minimum"

各項目の制約を組み合わせると、レイアウト要素にこれらの暗黙の制約が与えられます:

最小優先最大
暗黙の制約(幅)156306∞ (Number.POSITIVE_INFINITY)
暗黙の制約(高さ)150150150

したがって、子アイテムの制約を破ることなく、レイアウトを156より狭くしたり、150より高くしたり低くしたりすることはできません。

ウィンドウとレイアウトの接続

通常のアンカー概念を使用して、レイアウトがウィンドウのサイズ変更に追従するようにすることができます。

RowLayout {
    id: layout
    anchors.fill: parent

レイアウトのサイズ制約に依存して、ウィンドウがレイアウト制約を超えてサイズ変更できないようにすることができます。レイアウトからサイズ制約を取得し、Window 要素のminimumWidthminimumHeightmaximumWidthmaximumHeightにこれらの制約を設定できます。次のコードは、レイアウトの制約を超えてウィンドウのサイズを変更できないようにします:

minimumWidth: layout.Layout.minimumWidth
minimumHeight: layout.Layout.minimumHeight
maximumWidth: 1000
maximumHeight: layout.Layout.maximumHeight

注: この場合、layout.Layout.maximumWidthは無限大であるため、WindowのmaximumWidthプロパティにバインドすることはできません。したがって、最大幅は固定値1000 に設定されます。

最後に、ウィンドウの初期サイズをレイアウトの暗黙のサイズに設定します:

width: layout.implicitWidth
height: layout.implicitHeight

アイテムのスパンとストレッチ

子アイテムが複数のセルを占めるようにするには、GridLayoutspans を使用します。例えば、GridLayout 、2行に渡って6つのセルがあるとします。一番上の行にはアイテムitem1、item2、item3 があります。下の行には、Itemitem4 があり、columnSpan: 3alignment が指定されています:Qt.AlignHCenter.これにより、item4は、下の行を構成する3つのセルの真ん中に配置されます。次のスニペットはその例です:

ApplicationWindow {
    id: root
    width: 300
    height: 300
    visible: true

    GridLayout {
       rows: 2
       columns: 3
       Rectangle {
           color: 'cyan'
           implicitWidth: 50
           implicitHeight: 50
       }
       Rectangle {
           color: 'magenta'
           implicitWidth: 50
           implicitHeight: 50
       }
       Rectangle {
           color: 'yellow'
           implicitWidth: 50
           implicitHeight: 50
       }
       Rectangle {
           color: 'black'
           implicitWidth: 50
           implicitHeight: 50
           Layout.columnSpan: 3
           Layout.alignment: Qt.AlignHCenter
       }
    }
}

行や列のサイズは、その内容によって暗黙的に与えられます。例えば、ボタンは、そのボタンがある列の幅や、そのボタンがある行の高さに影響します。これは、GridLayout が一様な分布を持たないことを意味します。このため、スパンを使ってレイアウトをストレッチすることはできません。アイテムやレイアウトのストレッチを操作するには、代わりにstretchFactorsやサイズヒントを使用してください。

注意: 暗黙的なサイズや優先的なサイズを設定する場合、それぞれのプロパティをレイアウト自体の幅や高さ、またはサイズ計算のために依存するアイテムの幅や高さにバインドしないでください。

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