Qt Quick Controls のサイズポリシー

本稿は「Size Policy for Qt Quick Controls」の抄訳です。
 

Qt Quick Layoutを使用する場合、子コンポーネントを引き伸ばすには、アッタッチされたプロパティのLayout.fillWidthまたはLayout.fillHeightを指定する必要があります。必要なコンポーネントが増えるにつれて、このプロセスは煩雑になる可能性があります。インラインコンポーネントは代替手段として役立ちますが、異なるコンポーネントタイプを扱う場合には、それほど効果的ではないかもしれません。このような課題に対処するため、Qt Quick Controls バージョン 6.7 では、ウィジェットにある同様の機能を反映したサイズポリシー機能が導入されました。

サイズポリシーとは?

サイズポリシーは、アイテムがレイアウト内に配置されたときに優先する水平方向と垂直方向のサイズ変更ポリシーを記述します。これは、アイテムのサイズの拡大、縮小、拡張に影響します。Qt Widgetsはすでにこの機能をサポートしており、各ウィジェットタイプがどのようにサイズを変更するか、レイアウトと通信することができます。この結果、アプリケーション開発者がウィジェットのサイズ変更動作を指定する必要はほとんどありません。

例えば、QLineEdit と QSlider は、QSizePolicy::Expanding というデフォルトの水平サイズポリシーを持っているので、アプリケーション開発者が追加設定をしなくても、デフォルトで大きくなるように設定されます。

Qt Quick Layouts は、もう少し原始的な方法でサイズポリシーを指定します: レイアウトがアイテムのサイズを変更するかどうかを指定する唯一の方法は、アイテムにアタッチされたプロパティとして Layout.fillWidth: true またはLayout.fillHeight: trueを明示的に設定することです。これによって、アイテムはその好ましいサイズを越えて縮小も拡大もできることに注意してください。

これは、テキストフィールドやスライダーのような一般的なUIコンポーネントで、水平方向には伸ばしたいけど垂直方向には伸ばしたくないという場合に、繰り返し定型的なコードを書くことになりますそのため、これらの項目を宣言するたびにLayout.fillWidth:trueを設定することになりがちです。

Qt Quick Layouts をサイズポリシーで拡張

この定型的なコードを避けるために、同じQWidgetのサイズポリシー機構をクイックアイテムに導入するのは良いアイデアだと考えましたが、互換性の理由から、アプリケーション開発者が明示的に有効にする必要があります。この機能を有効にすることで、Qtクイックレイアウトの固定サイズが、タイプ固有のサイズポリシーで上書きされます。例えば、ボタンは水平方向には好ましいサイズポリシーが適用され、垂直方向には固定されます。

今のところ、この機能は Qt Quick で Qt::AA_QtQuickUseDefaultSizePolicy というグローバルなアプリケーション属性を設定することで有効にできます。


QGuiApplication::setAttribute(Qt::AA_QtQuickUseDefaultSizePolicy);
ユーザーにとってのメリット

ユーザーは、レイアウトにクイックアイテムを追加するたびに、Layout.fillWidth / Layout.fillHeightプロパティを設定する必要がなくなります。Qt Widgetsのユーザーは、レイアウト内のアイテムにデフォルトのレイアウトポリシーが設定されることを想定して、Qt Quickに移行することができます。

以下の例では、アプリケーションでデフォルトのサイズポリシーが有効になっている場合、Layout アタッチされたプロパティを削除できます。


RowLayout {
    Label {
        text: "Name"
    }
    TextField {
        placeholderText: "Surname, firstname"
        Layout.fillWidth: true   // <-- Can be removed if default size policy is enabled
    }
}
現在の落とし穴
  • グローバルスイッチを使用するソリューションには、アプリケーションで外部コンポーネントが使用されている場合(この機能を認識しないサードパーティ・ライブラリのコンポーネントなど)に欠点があります。これは現在検討中であり、修正される予定です。

  • Quick Itemのサイズポリシーは現在のところ内部的なものであり、明示的に設定することはできませんが、既存のレイアウトアタッチプロパティ(Layout.fillWidthと Layout.fillHeightを使用)で調整することは可能です。

  • 6.7.0のQuick Itemは、Expanding またはMinimum ポリシーをサポートしていませんが、将来のバージョンではサポートされるものとします。 

将来のための拡張
  • サイズポリシープロパティを公開し、レイアウト内に配置されたQuick Itemのデフォルトポリシーをユーザーが設定またはオーバーライドできます。

この機能は技術プレビュー中ですので、ユーザーの皆様に試していただき、フィードバックを提供していただければ幸いです。


Blog Topics:

Comments