2012-06-15 60 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"