このページでは

概念 - ビジュアル・ペアレント(Qt Quick

ビジュアル・ペアレント

Qt Quick を使用してビジュアルシーンを作成する際には、「ビジュアル親」という概念を理解することが重要です。

Qt Quick におけるビジュアル・ペアレンツの概念は、QObject の親階層におけるオブジェクト・ペアレンツの概念とは別物ですが、関連しています。すべての QML オブジェクトにはオブジェクト・ペアレンツがあり、これはオブジェクトが宣言されているオブジェクト階層によって決定されます。QtQuick モジュールを使用する場合、Item 型は、このモジュールが提供するすべてのビジュアルアイテムの基底型であり、アイテムのparent プロパティによって定義される追加のビジュアル親の概念を提供します。すべてのアイテムにはビジュアル親が存在します。アイテムのparent プロパティの値がnull の場合、そのアイテムはシーンにレンダリングされません。

アイテムのdata プロパティに割り当てられたオブジェクトは、メモリ管理の目的上、QObject 階層内でそのアイテムの子となります。 さらに、data プロパティに追加されたオブジェクトがItem タイプの場合、そのオブジェクトはItem::children プロパティにも割り当てられ、ビジュアルシーン階層内でそのアイテムの子となります。(ほとんどのQt Quick 階層探索アルゴリズム、特にレンダリングアルゴリズムは、ビジュアルな親階層のみを考慮します。)

便宜上、Itemのdata プロパティはデフォルトのプロパティとなっています。つまり、Item オブジェクト内で特定のプロパティに割り当てられずに宣言された子アイテムは、自動的にdata プロパティに割り当てられ、前述のようにそのアイテムの子となります。 したがって、以下の2つのコードブロックは同じ結果を生成し、右側に示されたような明示的な `data ` への代入ではなく、ほぼ常に左側に示されたような形式になるでしょう:

import QtQuick 2.0

Item {
    width: 100; height: 100

    Rectangle { width: 50;
                height: 50;
                color: "red" }
}
import QtQuick 2.0

Item {
    width: 100; height: 100

    data: [
        Rectangle { width: 50;
                    height: 50;
                    color: "red" }
    ]
}

項目の視覚的な親は、parent プロパティを設定することでいつでも変更できます。したがって、項目の視覚的な親は、必ずしもそのオブジェクトの親と同じであるとは限りません。

あるアイテムが別のアイテムの子になった場合:

  • 子アイテムの `parent ` は、その親アイテムを指します
  • 親アイテムのchildren およびchildrenRect プロパティは、その子アイテムを考慮に入れる

あるアイテムを別のアイテムの子として宣言しても、その子アイテムが親アイテム内に収まるように自動的に適切な位置やサイズに調整されるわけではありません。 一部のQML型には、子項目の配置に影響を与える組み込みの挙動がある場合があります。たとえば、Row オブジェクトは自動的にその子項目を水平配列に再配置しますが、これらはその型固有の実装によって強制される挙動です。 さらに、親アイテムは、clip プロパティがtrueに設定されていない限り、子アイテムを親の視覚的な境界内に収まるように自動的にクリップすることはありません。

以下のセクションで説明するように、特定の状況下では、項目の視覚的な親が考慮の対象となる場合があります。

項目の座標

アイテムの座標は視覚的な親を基準としているため、視覚的な階層構造の変更によって影響を受ける可能性があります。詳細については、「視覚座標」の概念ページを参照してください。

重ね合わせ順序

Qt Quick アイテムは、衝突が発生した場合にどのアイテムを上に描画するかを決定するために、再帰的な描画アルゴリズムを使用します。一般に、アイテムは親アイテムの上に、作成された順序(または QML ファイルで指定された順序)で描画されます。したがって、次の例では、青い長方形が緑の長方形の上に描画されます:

Rectangle {
    color: "#272822"
    width: 320
    height: 480

    Rectangle {
        y: 64
        width: 256
        height: 256
        color: "green"
    }

    Rectangle {
        x: 64
        y: 172
        width: 256
        height: 256
        color: "blue"
    }
}

緑の長方形に青い長方形が重なっており、その上に青で描かれている

このアルゴリズムは視覚的なアイテム階層を再帰的に処理するため、緑色の長方形の子要素も、青い長方形の下、および青い長方形の子要素のすべての下に描画されます。

重ね合わせ順序は、Item::z プロパティで調整できます。Z値が0未満の場合、そのアイテムは親アイテムの下に配置されます。また、Z値が指定されている場合、同階層のアイテムはZ値の順に配置されます(同値の場合は作成順で決定されます)。Z値は、同階層のアイテムおよび親アイテムとの重ね合わせ順序にのみ影響します。 親アイテムより上位にルートを持つサブツリーによって隠れてしまっているアイテムがある場合、そのアイテムにZ値を指定しても、そのサブツリーより上に配置されるよう重ね順が上がることはありません。そのアイテムを他のサブツリーより上に配置するには、階層の上位にあるZ値を変更するか、視覚的なアイテム階層を再配置する必要があります。

Rectangle {
    color: "#272822"
    width: 320
    height: 480

    Rectangle {
        y: 64
        z: 1
        width: 256
        height: 256
        color: "green"

        Rectangle {
            x: 192
            y: 64
            z: 2000
            width: 128
            height: 128
            color: "red"
        }
    }

    Rectangle {
        x: 64
        y: 192
        z: 2
        width: 256
        height: 256
        color: "blue"
    }
}

z値が高いにもかかわらず、青の下に赤がある緑、赤、青の長方形

上記の例では、赤い長方形はz値が高いにもかかわらず、青い長方形の下に配置されています。これは、赤い長方形が緑の長方形の子であり、緑の長方形が青い長方形の兄弟要素であるためです。 緑色の長方形のz値は青色の長方形よりも低いため、緑色の長方形とそのすべての子要素は、青色の長方形の下の位置に配置されます。

キャンバスの所有権

Qt Quick シーンで何がレンダリングされるかは、QQuickWindow::contentItem をルートとするビジュアルアイテムツリーによって定義されます。したがって、特定のQt Quick シーンにアイテムを追加してレンダリングするには、そのアイテムを、QQuickWindow::contentItem など、すでにビジュアルアイテム階層内にあるアイテムのビジュアル階層の子要素にする必要があります。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.