小部件上的Qt滚动区域弄乱了小部件的大小和位置[Qt 5.1]

小部件上的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)

我是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);
}

当我运行程序时,此实现有两个问题,第一个是innerWidget出现不合适(我在Qt Creator的设计模式中定义了它的位置),第二个是在布局中添加了许多小部件后,滚动条没有增长,而是小部件变小以适应布局:

在中,建议将WidgetResizeable设置为true:

scrollArea->setWidgetResizable(true);
滚动条现在似乎可以工作了,但新的问题是innerWidget变得非常小,几乎看不见:


那么,如何实现一个尊重设计大小和位置的可滚动小部件呢

没有可验证的环境,但祝你好运

  • 要将滚动区域放置到目标位置

    • 手动调用SetGeometry,或
    • 在ui表单中放置QScrollara(如果是静态的,建议使用),或者
    • 将小部件放置在目标位置,并将QScrollArea的父项设置为该小部件,将QScrollArea添加到其布局中,并将QScrollArea设置为正在扩展
  • 手动创建一个QWidget innerWidget并通过QScrollArea::setWidget(*QWidget)将其分配给scrollArea,尝试对innerWidget使用不同的大小策略,例如“首选”

还要注意提到的Qt参考:
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->SetWidgetResizeable(true);
    使外套左上角的scrollArea“收缩”。这是因为,QScrollArea不会随着其内容而增加,它可以滚动显示其所有内容,以便QScrollArea所需的大小可以尽可能小。一旦“Resizeable”属性设置为“true”,QScrollArea决定缩小到其所需的最小大小,从而显示其滚动条和滚动按钮的大小


非常感谢,回答得很好!我觉得scrollArea会得到innerWidget的几何图形,显然我错了。回答得很好。我有一个表单布局,我直接添加到了我的滚动区域的布局中,但是有这么多行,它会缩小到所有东西都看不见的地步。首先创建一个通用的QWidget,然后将我的布局添加到其中,然后将其添加为滚动区域的小部件,效果非常好!