它應該自然工作,所以你做錯了什麼。小部件上的佈局的默認sizeConstraint
僅在小部件太小時增長。您可以將其更改爲增大和縮小小部件。
您必須將新的小部件添加到佈局中。
您的主窗口中不能有minimumSize()
。如果您從返回非零值的小部件派生,則必須覆蓋它並返回零大小。
您不必在delete
之前隱藏子窗口小部件。沒有用。只需刪除它們,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"
爲什麼你所期望的主窗口,當你告訴子控件調整大小,你告訴它這樣做呢? – cmannett85