web-dev-qa-db-ja.com

すべてのコンテンツに合う最小サイズのQtウィジェット

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

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

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

_|<1st widget>|
_

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

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

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

_|<2nd, longer widget>|
_

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

18
rainer

あなたの推測は正しいです。レイアウト内のウィジェットのサイズポリシーを設定する必要があります。目的の効果を実現するには、最初のウィジェットに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();
}
9
divanov