2012-06-15 118 views
1

我想上一個QMainWindow刷新QWidget,其實我只是改變它的佈局,是一個充滿QGroupBoxs刷新佈局需要調整大小?

所以一個QVBoxLayout,當某一信號emited,在QMainWindow隱藏所有QWidget的現在,在它的佈局(在刪除它們之前),然後製作新的和show()它們。事情是,在90%的時間裏,QWidget的新名單更大。所以刷新完成後,新的QWidget實際上顯示,但QMainWindow是舊的大小!一個簡單的調整大小(使用鼠標)使得QMainWindow被調整到適當的大小。

是否有任何功能適用於QWidget?在它的佈局?在QMainWindow

我想他們每個人的adjustSize(),但沒有奏效

+0

爲什麼你所期望的主窗口,當你告訴子控件調整大小,你告訴它這樣做呢? – cmannett85

回答

1

它應該自然工作,所以你做錯了什麼。小部件上的佈局的默認sizeConstraint僅在小部件太小時增長。您可以將其更改爲增大和縮小小部件。

  1. 您必須將新的小部件添加到佈局中。

  2. 您的主窗口中不能有minimumSize()。如果您從返回非零值的小部件派生,則必須覆蓋它並返回零大小。

  3. 您不必在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"