Ничего не отображается в QScrollArea

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

Поскольку разное количество ползунков приводит к тому, что окно будет иметь разные размеры в разное время, теперь я хочу немного очистить содержимое, ограничив ползунки 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*. Во-вторых, вы поставляете родителей большинству дочерних виджетов. Как правило, вы не должны этого делать, так как, например, макет, к которому добавлен виджет, станет владельцем, т.е. макет станет родительским для добавленного виджета. Ниже в принципе что бы я делал. По крайней мере, это укажет вам лучшее направление.

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.]
}
Другие вопросы по тегам