24

andを使用するQWidgetインスタンスが欲しいのですQHBoxLayoutが(理想的には自動的ですが、関数を呼び出すと問題ありません)、コンテンツに合わせて水平方向にサイズ変更します。コンテナ自体を含むすべてのウィジェットの高さが同じになるため、水平方向のサイズ変更で十分です。

ユースケースは次のとおりです。ウィジェット(コンテナと呼びましょう)はフローティングです。つまり、レイアウトの一部ではありません。ユーザーは、(関数を呼び出すことによって)固定サイズのウィジェットをコンテナーのレイアウトに追加できる必要があります。このウィジェット上で、コンテナーは新しいコンテンツに合わせて拡張されます。ユーザーは、以前に追加されたウィジェットを削除できる必要があります。このウィジェットで、コンテナーは再び縮小します。コンテナは、最初のウィジェットが挿入され、最後のウィジェットが削除されるまで削除されます。つまり、コンテナには常に少なくとも1つのウィジェットが含まれます。

例:最初のウィジェットを追加すると、コンテナーは次のように|なり、左/右の境界線になります。

|<1st widget>|

別のものを追加すると、次のようになります。

|<1st widget>  <2nd, longer widget>|

最初のウィジェットを削除すると、次のようになります。

|<2nd, longer widget>|

これはちょっと単純なはずですが、コンテナの、、、とそのレイアウトの間のどこかで迷子になり、sizeHintサイズを明示的に設定して更新を強制する試みが何度か行われ、本質的にどこにも行きませんでした(つまり、コンテナのサイズがまったく変更されていません、コンテナは成長するだけで収縮しないなど)。何か明らかなことを見逃したに違いないのではないかと思います。sizePolicyadjustSize()sizeContraint

4

1 に答える 1

12

あなたの推測は正しいです。レイアウト内のウィジェットのサイズポリシーを設定する必要があります。最初のウィジェットには必要がQSizePolicy::Minimumあり、2番目のウィジェットにはQSizePolicy::Expanding目的の効果を実現する必要があります。サンプルアプリケーションは次のとおりです。

#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton *button1 = new QPushButton("Hello");
    button1->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
    QObject::connect(button1, SIGNAL(clicked(bool)), button1, SLOT(hide()));
    QPushButton *button2 = new QPushButton("World");
    button2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
    QObject::connect(button2, SIGNAL(clicked(bool)), button2, SLOT(hide()));

    QHBoxLayout *layout = new QHBoxLayout();
    layout->addWidget(button1);
    layout->addWidget(button2);

    QWidget main;
    main.setLayout(layout);
    main.show();

    return a.exec();
}
于 2012-12-08T09:52:42.910 に答える