我是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的设计模式中定义它的位置),然后在布局中添加了许多小部件之后,滚动条不会增长,但小部件变得更小,以适应布局:
在another thread中,建议将widgetResizable设置为true:
scrollArea->setWidgetResizable(true);
滚动条似乎现在可以正常工作,但新问题是innerWidget变得非常小,所以它几乎看不见:
那么,我如何实现一个可以尊重设计大小和位置的可滚动小部件呢?
答案 0 :(得分:3)
没有环境可以验证,但祝你好运。
将scrollArea放置在目标位置
手动创建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决定缩小到其最小必要大小,从而显示其滚动条和滚动按钮的大小....