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

У меня есть хороший виджет, который в основном выглядит как диалоговое окно с кучей QSlider'ов на нем. Количество ползунков варьируется в зависимости от ситуации, когда вызывается диалог (не фактический 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]
}

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


person norman    schedule 11.09.2013    source источник


Ответы (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.]
}
person user2672165    schedule 11.09.2013
comment
Я не знаю, какое вуду предоставило добавление этого VBoxLayout, но, похоже, это помогло. +1 это, а также другие советы. - person norman; 12.09.2013