У меня есть хороший виджет, который в основном выглядит как диалоговое окно с кучей 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]
}
Этот процесс не приводит к отображению ничего в общем диалоговом окне, кроме неподвижной полосы прокрутки слева. Каков, если возможно, правильный порядок шагов инициализации, чтобы сделать эту работу? Я предполагаю, что я мог дать что-то не тому родителю или установить макет в неподходящее время, но перестройки, которые я пробовал до сих пор, не сработали …
Прежде всего вам не нужно создавать явные элементы для дочерних виджетов и макета для вашего 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.]
}
Других решений пока нет …