2012-04-20 1 views
3

하나의 QWidget 안에 QDockWidget (부동이 아니고 닫을 수 있음)이 있습니다. 각 QDockWidget 안에 일부 위젯이 있습니다. 높이가 같아야합니다. 내부 위젯은 컨텍스트 메뉴를 통해 숨길 수 있습니다.Qt 서브 위젯 높이를 어떻게 같습니까?

내 위젯의 높이가 동일해야합니다. 일부 수평 스크롤 일부 레이블 ... 이제 내 내부 위젯이 서로 다른 크기를 가지고 : 나는 각 QDockWidget 일부 CONST 요소를 추가 할 때까지

void MyDocksPanel::redistributeSpace() 
{ 
    QBoxLayout * lay = (QBoxLayout *)layout(); 
    for (int i = 0; i < lay->count(); i++) 
    { 
     QWidget * dock = lay->itemAt(i)->widget(); 
     if (dock == NULL) 
      continue; 

     int size = 0; 
     foreach(QWidget * subWidget, dock->findChildren<QWidget*>()) 
      size += subWidget->isVisible() ? 1 : 0; 

     if (dock->isVisible() && (size == 0)) 
      dock->hide(); 
     lay->setStretch(i, size); 
    } 
} 

모두 잘 작동 : 나는이 방법을 수행. 그러나 나를 높이 평가할 필요가 있습니다.

QLayout은 위젯의 계층 구조의 한 수준에서 위젯 크기를 배치합니다. 높이 단위의 위젯을 만들려면 어떻게해야합니까?

enter image description here

하지만, 내가 추가 한 스크롤 막대 :

3 subwidgets 대 2 subwidgets

First picture

나의 첫번째 전략은 뻗어 3과 2를 설정합니다 enter image description here

제 5 위젯

하이츠는 37,37,37,28,28 같음 ... 그리고 문제를 이잖아하는

답변

4

스트레치 요소가 올바르지 만 작은 비율이 아니라 픽셀 값으로 생각하면됩니다. 이 각 독 위젯 신장 인자 설정보십시오 childWidgetMinimumHeightscrollBarHeight 양쪽 픽셀로 표현하고, 두 상수가된다

dockWidgetStretch = numChildWidgets * childWidgetMinimumHeight + scrollBarHeight; 

.

편집 : 다음은 작동하는 예제입니다. 프로그램과 함께 작동 시키려면 약간의 실험을해야 할 수도 있지만 이는 좋은 시작일 것입니다.

header.h가

#include <QtGui> 

class WidgetWith3Children : public QWidget 
{ 
public: 
    WidgetWith3Children() 
    { 
     QTextEdit *edit1 = new QTextEdit; 
     QTextEdit *edit2 = new QTextEdit; 
     QTextEdit *edit3 = new QTextEdit; 
     QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal); 
     QVBoxLayout *layout = new QVBoxLayout; 
     layout->addWidget(edit1); 
     layout->addWidget(edit2); 
     layout->addWidget(edit3); 
     layout->addWidget(scrollBar); 
     setLayout(layout); 
    } 
}; 

class WidgetWith2Children : public QWidget 
{ 
public: 
    WidgetWith2Children() 
    { 
     QTextEdit *edit1 = new QTextEdit; 
     QTextEdit *edit2 = new QTextEdit; 
     QScrollBar *scrollBar = new QScrollBar(Qt::Horizontal); 
     QVBoxLayout *layout = new QVBoxLayout; 
     layout->addWidget(edit1); 
     layout->addWidget(edit2); 
     layout->addWidget(scrollBar); 
     setLayout(layout); 
    } 
}; 

class OuterWidget : public QWidget 
{ 
public: 
    OuterWidget() 
    { 
     QDockWidget *dockWidget1 = new QDockWidget; 
     QDockWidget *dockWidget2 = new QDockWidget; 
     dockWidget1->setWidget(new WidgetWith3Children); 
     dockWidget2->setWidget(new WidgetWith2Children); 
     QVBoxLayout *layout = new QVBoxLayout; 

     // 71 is the height of the minimum size hint for QTextEdit 
     // 30 is the height of a horizontal scrollbar (on my system) 
     layout->addWidget(dockWidget1, 71 * 3 + 30); 
     layout->addWidget(dockWidget2, 71 * 2 + 30); 

     layout->setMargin(0); 
     setLayout(layout); 
    } 
}; 

MAIN.CPP

#include <QtGui/QApplication> 
#include "header.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    OuterWidget w; 
    w.show(); 

    return a.exec(); 
} 
+0

QDockWidget의 머리글 높이와 여백 * 2를 추가하고 하위 항목과 스크롤바 사이에 간격을 추가해야합니까? – k06a

+1

내 생각 엔 그렇습니다. :) 그러나 그것을하지 않고 그것을 시도하고 그것이 작동하는지 확인하십시오. – Anthony

+0

2 일 전에 나는이 방법을 시도했다. 성공하지 못했습니다. 나는 내일 다시 시도 할 것이다. 그리고 난 childWidgetMinimumHeight에 문제가 있습니다 - 수동으로 전체 위젯의 크기를 조정하고 싶습니다 ... – k06a

1

그냥 이해 확인 : 여러 아이들뿐만 아니라 레이블을 포함하는 QDockWidget이 수평 스크롤 바입니다. 레이블과 스크롤 막대는 고정 된 높이 여야하고, 나머지 수직 공간은 하위 위젯들 사이에서 나눠 져야합니다.

그럴 경우 각 QDockWidgetQVBoxLayout을 추가하기 만하면됩니다. 내가 아래에했던대로 위젯을 추가

QDockWidget DockWidget; 
QVBoxLayout Layout = new QVBoxLayout(DockWidget); 

FixedHeightWidget.setFixedHeight(10) 
Layout.addWidget(FixedHeightWidget, 0); 
Layout.addWidget(FirstVariableHeightWidget, 1); 
Layout.addWidget(SecondVariableHeightWidget, 1); 
Layout.addWidget(ThirdVariableHeightWidget, 1); 

당신이 레이아웃에 추가 한 위젯 중 하나를 숨길 수 있다면, 레이아웃이 남아있는 가시의 아이의 크기를 조정 처리합니다.

+0

좋아,하지만 난 여러 QDockWidgets이는 QVBoxLayout을 int로.그리고 하위 위젯 전체가 동일한 크기를 가져야합니다. – k06a

+0

죄송합니다. 그게 무슨 뜻인지 모르겠어요! 조금 더 설명해 주시겠습니까? 어떤 종류의 이미지는 여기에서 정말 유용 할 것입니다. – sjwarner

+0

QVBoxLayout에 3-4 개의 QDockWidgets가 있으며, 각각에 1-5 개의 어린이 위젯이 있습니다 (QVBoxLayout도 사용). 어린이 위젯은 크기가 동일해야합니다. – k06a