それは自然に機能するはずなので、何か間違ったことをしています。ウィジェットのレイアウトのデフォルトsizeConstraint
では、ウィジェットが小さすぎる場合にのみ拡大されます。ウィジェットを拡大および縮小するように変更できます。
新しいウィジェットをレイアウトに追加する必要があります。
メイン ウィンドウにminimumSize()
. ゼロ以外を返すウィジェットから派生する場合はminimumSize()
、それをオーバーライドしてサイズ 0 を返す必要があります。
delete
子ウィジェットをing する前に非表示にする必要はありません。無意味です。それらを削除するだけで、Qtはそれを適切に処理します。
以下の完全な例を参照してください。OS X および Windows XP + MSVC でテスト済み。
//main.cpp
#include <cstdlib>
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QHBoxLayout>
#include <QPushButton>
static int pick() { const int N = 10; return (qrand()/N) * N / (RAND_MAX/N); }
class Window : public QWidget {
Q_OBJECT
QLayout * layout;
public:
Window() {
layout = new QHBoxLayout;
QPushButton * button;
button = new QPushButton("Randomize", this);
connect(button, SIGNAL(clicked()), SLOT(randomize()));
layout->addWidget(button);
button = new QPushButton("Grow", this);
button->setCheckable(true);
connect(button, SIGNAL(toggled(bool)), SLOT(grow(bool)));
layout->addWidget(button);
setLayout(layout);
}
private slots:
void randomize() {
// remove old labels
foreach (QObject * o, findChildren<QLabel*>()) { delete o; }
// add some new labels
int N = pick();
while (N--) {
layout->addWidget(new QLabel(QString(pick(), 'a' + pick()), this));
}
}
void grow(bool shrink)
{
QPushButton * button = qobject_cast<QPushButton*>(sender());
if (shrink) {
button->setText("Grow && Shrink");
layout->setSizeConstraint(QLayout::SetFixedSize);
} else {
button->setText("Grow");
layout->setSizeConstraint(QLayout::SetDefaultConstraint);
}
}
};
int main(int c, char ** v)
{
QApplication app(c,v);
Window w;
w.show();
return app.exec();
}
#include "main.moc"