2012-04-20 7 views
3

У меня есть QDockWidget s (не плавающий, только закрытый) внутри одного QWidget. У меня есть некоторые виджеты внутри каждого QDockWidget - их высоты должны быть равны. Эти внутренние виджеты могут быть скрыты через контекстное меню.Как сделать высоту подошвы Qt равной?

Мои внутренние виджеты должны иметь равную высоту. Я сделал это так:

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); 
    } 
} 

Все работает отлично, пока я не добавить некоторые константные элементы для каждого QDockWidget: некоторые горизонтальные полосы прокрутки и некоторые ярлыки ... Теперь мои внутренние виджеты имеют разные размеры. Но мне необходимо установить, что их высоты сильно равны.

QLayout определяет размеры виджета на одном уровне иерархии виджета. Как я могу сделать подобранные по высоте подвиды?

3 Подвиджетов против 2 Подвиджетов

First picture

Моей первой стратегии установить растяжку 3 и 2:

enter image description here

Но, когда я добавил полосы прокрутки:

enter image description here

Высоты моих 5 виджетов равно 37,37,37,28,28 ... и вот неполадку

ответ

4

Вы находитесь на правильном пути с коэффициентом растяжения, но думайте с точки зрения значений пикселей, а не небольших пропорций. Попробуйте установить коэффициент растяжения каждого виджета дока к этому:

dockWidgetStretch = numChildWidgets * childWidgetMinimumHeight + scrollBarHeight; 

, где childWidgetMinimumHeight и scrollBarHeight оба выражены в пикселях, и обе константы.

EDIT: Вот рабочий пример. Возможно, вам придется немного поэкспериментировать, чтобы заставить его работать с вашей программой, но это должно быть хорошим началом.

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 и margin * 2 и расстояние между подэлементами и полосой прокрутки? – k06a

+1

Мое предположение да, вы должны. :) Но попробуйте, не делая этого, и посмотрите, работает ли это. – Anthony

+0

Два дня назад я пробовал этот путь. Нет успеха. Завтра я попробую. И у меня проблема с childWidgetMinimumHeight - я хотел бы изменить размер всего виджета вручную ... – k06a

1

Просто, чтобы проверить, я понимаю: у вас есть QDockWidget, который содержит несколько детей, а также этикетки и горизонтальную полосу прокрутки. Метка и полоса прокрутки должны иметь фиксированную высоту, а оставшееся вертикальное пространство должно быть разделено между дочерними виджетами.

Если это верно, все, что вам нужно сделать, это добавить QVBoxLayout к каждому QDockWidget. Добавьте виджеты, как я сделал ниже:

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 Int QVBoxLayout.И целиком по подвижкам должны быть одинаковые размеры. – k06a

+0

Извините, чувак, не уверен, что я понимаю, что вы имеете в виду! Не могли бы вы объяснить немного дальше? Какой-то образ действительно полезен здесь. – sjwarner

+0

У меня есть 3-4 QDockWidgets в QVBoxLayout с 1-5 дочерними виджетами в каждом (с помощью QVBoxLayout тоже). Детские виджеты должны иметь одинаковые размеры. – k06a