用哪个Qt小部件来滚动窗口小部件?

11

我正在为我的学校开发一个Qt项目。在这个项目中,我需要在一个窗口中列出未知数量的元素,而不改变窗口内容的大小。

过去我曾经使用过一些VBoxLayout,但这完全不是我寻找的。这个部件会根据它包含的元素数量来调整内容的大小。我想做的是将尽可能多的部件添加到“滚动部件”中,并使它们自动相邻堆叠,而不会调整其大小。

我尝试使用QScrollArea,但无法让元素相互堆叠。

以下是一个简单的示意图解释了我的问题: enter image description here

3个回答

11

以下是我使用 QVBoxLayoutQScrollArea 的方法:

//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);
        }   

    }

2

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]);

2
如果您的显示元素比较简单,最简单的解决方案是使用。这将自动调整大小并在添加项目时通知。您只需要调用 setWidget(myListWidget)>进行初始化,然后 addItem(myListWidgetItem)>添加新项目即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接