我正在为我的学校开发一个Qt项目。在这个项目中,我需要在一个窗口中列出未知数量的元素,而不改变窗口内容的大小。
过去我曾经使用过一些VBoxLayout
,但这完全不是我寻找的。这个部件会根据它包含的元素数量来调整内容的大小。我想做的是将尽可能多的部件添加到“滚动部件”中,并使它们自动相邻堆叠,而不会调整其大小。
我尝试使用QScrollArea
,但无法让元素相互堆叠。
以下是一个简单的示意图解释了我的问题:
以下是我使用 QVBoxLayout
和 QScrollArea
的方法:
//scrollview so all items fit in window
QScrollArea* techScroll = new QScrollArea(tabWidget);
techScroll->setBackgroundRole(QPalette::Window);
techScroll->setFrameShadow(QFrame::Plain);
techScroll->setFrameShape(QFrame::NoFrame);
techScroll->setWidgetResizable(true);
//vertical box that contains all the checkboxes for the filters
QWidget* techArea = new QWidget(tabWidget);
techArea->setObjectName("techarea");
techArea->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
techArea->setLayout(new QVBoxLayout(techArea));
techScroll->setWidget(techArea);
然后在添加项目时,您可以像这样操作(使用 lay = techArea->layout()
和 parent = techarea
):
for(std::set<Event::Enum>::iterator it = validEvents.begin(); it != validEvents.end();
++it){
QCheckBox* chk = new QCheckBox(
"text", parent);
if(lay){
lay->addWidget(chk);
}
}
RedX的回答有点含糊,但我成功地使用了他的方法:
QRadioButton *radio[40];
for (int i = 0;i<40;i++)
radio[i] = new QRadioButton(tr("&Radio button 1"));
QWidget* techArea = new QWidget;
techArea->setObjectName("techarea");
techArea->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
techArea->setLayout(new QVBoxLayout(techArea));
ui->scrollArea->setWidget(techArea);
QLayout *lay = techArea->layout();
for (int i = 0;i<40;i++)
lay->addWidget(radio[i]);