小部件上的Qt滚动区域弄乱了小部件的大小和位置[Qt 5.1]
我是Qt新手,我想实现一个可滚动的小部件,它可以动态增长,例如,当按下另一个按钮时,向其中添加按钮。我尝试使用以下布局和代码来实现它:小部件上的Qt滚动区域弄乱了小部件的大小和位置[Qt 5.1],qt,layout,widget,scroll,Qt,Layout,Widget,Scroll,我是Qt新手,我想实现一个可滚动的小部件,它可以动态增长,例如,当按下另一个按钮时,向其中添加按钮。我尝试使用以下布局和代码来实现它: scrollArea = new QScrollArea(ui->outerWidget); scrollArea->setWidget(ui->innerWidget); layout = new QVBoxLayout(ui->outerWidget); ui->innerWidget->setLayout(layout)
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);
}
当我运行程序时,此实现有两个问题,第一个是innerWidget出现不合适(我在Qt Creator的设计模式中定义了它的位置),第二个是在布局中添加了许多小部件后,滚动条没有增长,而是小部件变小以适应布局:
在中,建议将WidgetResizeable设置为true:
scrollArea->setWidgetResizable(true);
滚动条现在似乎可以工作了,但新的问题是innerWidget变得非常小,几乎看不见:
那么,如何实现一个尊重设计大小和位置的可滚动小部件呢 没有可验证的环境,但祝你好运
- 要将滚动区域放置到目标位置
- 手动调用SetGeometry,或
- 在ui表单中放置QScrollara(如果是静态的,建议使用),或者
- 将小部件放置在目标位置,并将QScrollArea的父项设置为该小部件,将QScrollArea添加到其布局中,并将QScrollArea设置为正在扩展李>
- 手动创建一个QWidget innerWidget并通过QScrollArea::setWidget(*QWidget)将其分配给scrollArea,尝试对innerWidget使用不同的大小策略,例如“首选”
void qscrolrea::setWidget(QWidget*widget)
设置滚动区域的小部件。
....
请注意,在调用此函数之前,必须添加小部件的布局;如果以后添加,则无论何时显示滚动区域,小部件都将不可见。在这种情况下,以后也不能显示()小部件
以上列出了解决方案,以下是您提到的问题的原因:
scrollArea->setWidget(ui->innerWidget)代码>将小部件设置为ScrollArea将更改ui->innerWidget的父项和布局,因此以ui形式(在Qt Creater中)编写的几何值将不再生效,这就是innerWidget不合适的原因。ui->innerWidget不再是outerWidget的子项,它的几何体将跟随它的新父项(但不是scrollArea,QScrollArea内部有一些复杂的布局)。要清楚,innerWidget在这种情况下对定位scrollArea没有帮助
- 在您的第一个代码片段中,小部件“scrollArea”是使用父outerWidget创建的,同样没有指定大小策略、布局或几何体,因此scrollArea默认放置在父“outerWidget”的左上角。要将scrollArea放置到目标几何体,您可以“手动设置几何体”或将innerWidget指定为scrollArea的父对象并展开scrollArea”。显然,后一种方法无法将ui->innerWidget指定给scrollArea->setWidget()
使外套左上角的scrollArea“收缩”。这是因为,QScrollArea不会随着其内容而增加,它可以滚动显示其所有内容,以便QScrollArea所需的大小可以尽可能小。一旦“Resizeable”属性设置为“true”,QScrollArea决定缩小到其所需的最小大小,从而显示其滚动条和滚动按钮的大小scrollArea->SetWidgetResizeable(true);