2012-06-15 2 views
1

가 실제로 난 그냥 그래서 QGroupBoxs레이아웃을 새로 고치려면 크기를 조정해야합니까?

가득 QVBoxLayout이다 레이아웃의 변경하는 QMainWindowQWidget을 갱신하기 위해 노력하고있어, 특정 신호가 emited 될 때 QMainWindow 모든 QWidget의 존재를 숨길 그건에서 레이아웃 (삭제하기 전에)을 입력 한 다음 새 파일을 만들고 show()을 만듭니다. 문제는, 시간의 90 %, QWidget의 새 목록이 더 큰 것입니다. 새로 고침이 완료되면 새로운 QWidget이 실제로 표시되지만 QMainWindow은 이전 크기입니다! 간단한 크기 조정 (마우스 사용)은 QMainWindow의 크기를 적절한 크기로 조정합니다.

QWidget에 적용 할 수있는 기능이 있습니까? 그것의 레이아웃에? QMainWindow에?

나는 그들 각각에 adjustSize()을 시도했지만

자연적으로 일을 해야하는
+0

왜 당신이 그렇게 말한, 당신은 자식 위젯을 표시 할 때 메인 창 크기를 조정 할 것으로 예상합니까? – cmannett85

답변

1

를 작동하지 않았다, 그래서 당신은 뭔가 잘못하고 있습니다. 위젯에서 레이아웃의 기본값 인 sizeConstraint은 너무 작은 경우에만 위젯을 확장하는 것입니다. 위젯을 확대 및 축소하기 위해이를 변경할 수 있습니다.

  1. 레이아웃에 새 위젯을 추가해야합니다.

  2. 기본 창에는 minimumSize()이 없어야합니다. 0이 아닌 minimumSize()을 리턴하는 위젯에서 파생 된 경우,이를 대체하고 0 크기를 리턴해야합니다.

  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"