24

コンテナウィジェットがあります。

サイズポリシーは「固定」です(縦と横の両方)。setMaxmimumWidth と setMaximumHeight が定義されています。

そこに QHBoxLayout コンテナを配置しました。それにウィジェットを追加します(幅/高さも固定されています)。しかし、「Show」を呼び出すと、これはどれも尊重されません。高さはほぼランダムで、レイアウト内の内部ウィジェットのいずれにも一致せず、最も高いアイテムのサイズの 2 倍であり、コンテナの幅は私が設定した固定幅をはるかに超えて伸びています。

私は何が欠けていますか?定義したコンテナの幅/高さを固定できないのはなぜですか? レイアウトが干渉し、その制約を尊重しないのはなぜですか?

4

1 に答える 1

34

混乱は、固定サイズのウィジェットが実際に固定サイズであるという事実から生じます。次のことが当てはまります: レイアウトに固定サイズのウィジェットしかない場合、レイアウトの全体のサイズは名目上固定され、その中のウィジェットは大きくなりません。ウィンドウのレイアウトとして設定すると、ウィンドウに制約を設定すると、ウィンドウが大きくなるのを制限できますSetFixedSize。ウィジェット間の間隔を広げたい場合を除き、固定サイズの項目のみを含むレイアウトのウィンドウにサイズ ポリシーを設定しても意味がありません。

ウィジェットを固定サイズのままにしたいが、ウィジェット間の間隔を大きくしたい場合、以下のコードに必要な唯一の変更は、すべてのウィジェットを固定サイズ ポリシーに設定することです。それらは成長できないため、できるのは間隔だけです。この例のすべてのポリシーを文字通りに設定するQSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)と、この動作が得られます。

特定の最小サイズで拡張可能なウィジェットと、特定の最小サイズの全体的なコンテナー ウィジェットが必要な場合は、そのように設定します。これの意味は:

  1. コンテナー ウィジェットの最小、最大、または固定サイズまたは幅/高さを設定します。

  2. ウィジェットの最小、最大、または固定サイズまたは幅/高さを設定します。

  3. 必要な動作を反映するように、ウィジェットのサイズ ポリシーを設定します。たとえば、一部のウィジェットを特定の方向にのみ拡大したり、まったく拡大したくない場合があります。

コンテナーに最小サイズを設定した場合、少なくとも 1 つのウィジェットが特定の方向に拡大する必要があります。したがって、コンテナーに幅を設定する場合、少なくとも 1 つのレイアウトされたウィジェットを水平方向に拡張して塗りつぶすことができる必要があります。コンテナーに高さを設定する場合、少なくとも 1 つのレイアウトされたウィジェットを垂直方向に拡張してそれを埋めることができる必要があります。

以下は、Qt 4.8.5 および 5.1.1 で正常に動作します。ウィンドウは拡大できますが、縮小できません。最小サイズがあります。を変更しsetMinimumSizesetFixedSize固定サイズのウィンドウを取得するか、最小サイズと最大サイズの両方を設定できます。

スクリーンショット

#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QFontDatabase>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget window;
    QHBoxLayout layout(&window);

    QLabel lbl1("one");
    lbl1.setStyleSheet("QLabel { background-color: #FF8080 }");
    lbl1.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));

    QLabel lbl2("two");
    lbl2.setStyleSheet("QLabel { background-color: #80FF80 }");
    lbl2.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
    lbl2.setMinimumHeight(300);

    QLabel lbl3("three");
    lbl3.setStyleSheet("QLabel { background-color: #8080FF }");
    lbl3.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
    lbl3.setMinimumWidth(300);

    layout.addWidget(&lbl1);
    layout.addWidget(&lbl2);
    layout.addWidget(&lbl3);
    window.setMinimumSize(800, 800);
    // Any combination of setMinimumSize and setMaximumSize is OK.
    // If the minimum and maximum are the same, just do setFixedSize

    window.show();
    return a.exec();
}
于 2013-09-25T17:31:41.000 に答える