Pregunta

I have a nice widget that basically looks like a dialog box with a bunch of QSliders on it. The number of sliders varies depending on the situation when the dialog (not an actual QDialog; just a QWidget) is invoked.

Since the varying number of sliders causes the box to be different sizes at different times, I now want to clean things up a bit by confining the sliders to a QScrollArea. If I understand things correctly, such a scroll area would display however many sliders fit within its height, and one could scroll down to see the rest if there were more.

Anyway, I tried a (somewhat complicated) procedure like this:

In constructor of custom QWidget class (m_variableName = member variable):

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.]
}

After the constructor, the real, situation-dependent set-up of sliders occurs:

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]
}

This process causes nothing to show up on the overall dialog, except for an immobile scroll bar on the left. What, if possible, is the proper order of initialization steps to make this work? My guess is that I might have given something the wrong parent or set a layout at the wrong time, but the rearrganements I've tried so far haven't worked...

¿Fue útil?

Solución

First of all you do not need to create explicit members for child widgets and layout to your CustomScrollBox unless you need to access them later (even then you might track them down through their child relationship to your CustomScrollBox). In particular, having set the layout of a widget you can use QWidget::layout to get QLayout* and downcast it to QGridLayout* or QVBoxLayout*. Secondly you are supplying parents to most of the child widgets ctors. Normally you should not do that as e.g. the layout to which the widget is added will take the ownership i.e. the layout will become parent to the added widget. Below is in principle what I would do. It will point you in a better direction at least.

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.]
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top