小部件上的Qt ScrollArea会混淆widget的大小和位置[Qt 5.1]

时间:2014-02-25 00:53:07

标签: qt layout widget scroll

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

enter image description here

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的设计模式中定义它的位置),然后在布局中添加了许多小部件之后,滚动条不会增长,但小部件变得更小,以适应布局:

enter image description here

another thread中,建议将widgetResizable设置为true:

scrollArea->setWidgetResizable(true);

滚动条似乎现在可以正常工作,但新问题是innerWidget变得非常小,所以它几乎看不见:

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

  • 将scrollArea放置在目标位置

    • 手动调用SetGeometry或
    • 以ui格式放置QScrollArea(如果它是静态的,建议使用)或
    • 将小部件放在目标位置,并将QScrollArea的父级设置为它,并将QScrollArea添加到其布局,并将QScrollArea设置为要扩展。
  • 手动创建QWidget innerWidget并通过QScrollArea :: setWidget(* QWidget)将其分配给scrollArea,尝试不同大小的策略到innerWidget,例如“Preferred”。

还要注意提到的Qt参考:void QScrollArea::setWidget ( QWidget * widget ) 设置滚动区域的小部件。 .... 请注意,在调用此函数之前,必须添加窗口小部件;如果稍后添加,则小部件将不可见 - 无论何时显示()滚动区域。在这种情况下,您也可以稍后再显示()小部件。

以上列表解决方案,以下是您提到的问题的原因:

  • scrollArea->setWidget(ui->innerWidget);将窗口小部件设置为ScrollArea将更改ui> innerWidget的父级和布局,因此以ui格式(在Qt Creater中)编写的几何值将不再生效,这是innerWidget不合适的原因。 ui> innerWidget不再是outerWidget的子节点,它的几何体将跟随它的新父节点(但不是scrollArea,在QScrollArea中有一些棘手的布局“。要清楚,innerWidget对于在这种情况下定位scrollArea没有帮助。

  • 在您的第一个代码片段中,小部件'scrollArea'是使用parent outerWidget创建的,同样没有指定大小策略或布局或几何,因此默认情况下scrollArea将放置在父级的左上角“ outerWidget”。要将scrollArea放置到目标几何体,可以“手动设置几何体”或“将innerWidget指定为scrollArea的父体并展开scrollArea”。显然后一种方法不能将ui-> innerWiget分配给scrollArea-> setWidget()。

  • scrollArea->setWidgetResizable(true);使得scrollArea在outerWidget的左上角“收缩”。这是因为,QScrollArea不随其内容一起增加,它可以滚动显示所有内容,因此所需的QScrollArea大小可以尽可能小。一旦'Resizable'属性设置为“true”,QScrollArea决定缩小到其最小必要大小,从而显示其滚动条和滚动按钮的大小....