2013-09-11 4 views
0

У меня есть хороший виджет, который в основном выглядит как диалоговое окно с кучей QSliders на нем. Количество слайдеров варьируется в зависимости от ситуации, когда вызывается диалог (а не фактический QDialog, а только QWidget).Ничего не видно в QScrollArea

Поскольку разное количество слайдеров заставляет окно иметь разные размеры в разное время, теперь я хочу немного почистить детали, ограничив ползунки QScrollArea. Если я правильно понимаю, такая область прокрутки будет отображаться, однако многие слайдеры подходят к ее высоте, и можно было бы прокрутить вниз, чтобы увидеть остальное, если бы было больше.

Во всяком случае, я попробовал (несколько сложнее) процедуру так:

В конструктор пользовательского класса QWidget (m_variableName = переменная член):

CustomScrollBox::CustomScrollBox(QWidget* _parent){ 

    setWindowTitle(...); 
    ... 

    m_scrollArea = new QScrollArea(this); 
    m_scrollAreaBox = new QGroupBox(m_scrollArea); 
    m_layout = new QGridLayout(); 
    m_scrollAreaBox->setLayout(m_layout); 
    m_scrollArea->setWidget(m_scrollAreaBox); 
    m_scrollArea->setFixedHeight(250); 

    m_bottomButton = new QPushButton(this); //probably irrelevant 
    ... 
    [connect calls, etc.] 
} 

После конструктора, реал, ситуациями зависимый установка ползунков происходит:

void 
CustomScrollBox::SetUpWidgets(){ 

    for([however many sliders the situation calls for]){ 
    CustomSlider* s = new CustomSlider(this, label); //just a QWidget consisting of a 
                 //QSlider and a QLabel to 
                 //the left of it 
    .. 
    m_layout->addWidget(s, [grid dimensions as needed]); 
    } 

    ... 
    [set text on bottom button, etc., and add it as well] 
} 

Этот процесс не вызывает ничего, чтобы показать на общем диалоге, для неподвижной полосы прокрутки слева кроме. Что, если возможно, является правильным порядком шагов инициализации, чтобы сделать эту работу? Я предполагаю, что я мог бы дать что-то не того родителя или установить макет в самое неподходящее время, но реорганизации, которые я пробовал до сих пор, не сработали ...

ответ

1

Прежде всего, вам не нужно создавать явные элементы дочерних виджетов и макета для вашего CustomScrollBox, если вам не потребуется доступ к ним позже (даже тогда вы можете отслеживать их через их дочерние отношения с вашим CustomScrollBox). В частности, установив макет виджета, вы можете использовать QWidget :: layout для получения QLayout * и опускать его на QGridLayout * или QVBoxLayout *. Во-вторых, вы предоставляете родителям большинство дочерних виджетах ctors. Обычно вы не должны этого делать, например, макет, к которому добавлен виджет, займет собственность, т. е. макет станет родительским для добавленного виджета. Ниже в принципе я бы сделал. По крайней мере, он укажет вам в лучшем направлении.

CustomScrollBox::CustomScrollBox(QWidget* parent) 
: QWidget(parent) 
{ 

    setWindowTitle(...); 
    ... 
    QVBoxLayout* vBoxLayout(new QVBoxLayout); 
    QScrollArea* scrollArea(new QScrollArea);  
    vBoxLayout->addWidget(scrollArea); 
    QGroupBox* groupBox(new QGroupBox); 
    QGridLayout* gridLayout(new QGridLayout); 
    gridLayout->addWidget(.../*whatever buttons etc*/) 
    groupBox->setLayout(gridLayout); 
    scrollArea->setWidget(groupBox); 
    setLayout(vBoxLayout);  
    ... 
    [connect calls, etc.] 
} 
+0

Я не знаю, что такое вуду, добавив этот VBoxLayout, но он, похоже, сделал трюк. +1, что, как и другие советы. – nicole

Смежные вопросы