Vas*_*lis 1 layout qt scroll widget
我是 Qt 的新手,我想实现一个可以动态增长的可滚动小部件,例如,在按下另一个按钮时向其中添加按钮。我尝试使用以下布局和代码来实现它:

scrollArea = new QScrollArea(ui->outerWidget);
scrollArea->setWidget(ui->innerWidget);
layout = new QVBoxLayout(ui->outerWidget);
ui->innerWidget->setLayout(layout);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// code for PushButton to add buttons in innerWidget
void MainWindow::on_pushButton_clicked()
{
QPushButton *button = new QPushButton("button"+QString::number( nameCounter ));
nameCounter ++;
ui->innerWidget->layout()->addWidget(button);
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,此实现有两个问题,首先,innerWidget 出现不合适(我在 Qt Creator 的设计模式中定义其位置),其次在布局中添加许多小部件后,滚动条不会增长,而是相反小部件变得更小以适应布局:

在另一个线程中,建议将 widgetResizable 设置为 true:
scrollArea->setWidgetResizable(true);
Run Code Online (Sandbox Code Playgroud)
滚动条现在似乎可以工作,但新的问题是innerWidget变得非常小,因此几乎不可见:

那么,如何实现一个符合设计大小和位置的可滚动小部件呢?
没有环境可以验证,但祝你好运。
将scrollArea放置到目标位置,
手动创建一个QWidget innerWidget并通过QScrollArea::setWidget(*QWidget)将其分配给scrollArea,尝试对innerWidget使用不同的大小策略,例如“Preferred”。
另请注意提到的 Qt 参考:void QScrollArea::setWidget ( QWidget * widget )
设置滚动区域的小部件。....注意,在调用此函数之前,您必须添加小部件的布局;如果您稍后添加它,则无论您何时 show() 滚动区域,该小部件都将不可见。在这种情况下,您也可以稍后不显示()该小部件。
以上列出了解决方案,以下是您提到的问题的原因:
scrollArea->setWidget(ui->innerWidget);将一个widget设置为ScrollArea会改变ui->innerWidget的父子关系和布局,因此以ui形式(在Qt Creater中)编写的几何值将不再生效,这就是innerWidget不合适的原因。ui->innerWidget不再是outerWidget的子级,它的几何形状将跟随其新父级(但不是scrollArea,QScrollArea内部有一些棘手的布局”。需要明确的是,innerWidget在这种情况下对于定位scrollArea没有帮助。
在您的第一个代码片段中,小部件“scrollArea”是使用父outerWidget创建的,同样没有指定大小策略或布局或几何形状,因此scrollArea默认情况下将放置在父“outerWidget”的左上角。要将scrollArea放置到目标几何体中,您可以“手动设置几何体”或“将innerWidget指定为scrollArea的父级并展开scrollArea”。显然后一种方法无法将ui->innerWiget赋值给scrollArea->setWidget()。
scrollArea->setWidgetResizable(true);使滚动区域“收缩”在outerWidget的左上角。这是因为,QScrollArea 不会随着内容的增加而增大,它可以滚动显示所有内容,因此 QScrollArea 所需的大小可以尽可能小。一旦“可调整大小”属性设置为“true”,QScrollArea 决定缩小到其最小必要尺寸,从而显示其滚动条和滚动按钮的尺寸......