QScroll区域与垂直滚动的问题

QScrollArea issue with vertical scroll

本文关键字:问题 滚动 垂直 区域 QScroll      更新时间:2023-10-16

我读了几页关于QScrollArea的页面,但我无法解决我的问题。我有下一个代码:

QDialog *window = new QDialog;
window->resize(300, 300);
for(int i = 0; i < 50; ++i)
{
    QLabel *label = new QLabel(window);
    label->move(10, i * 15);
    label->setText("Text");
}
QScrollArea *area = new QScrollArea;
area->setWidget(window);
area->show();

似乎没有出现来自QScrollArea的垂直滚动。我不能使用 QVBoxLayout,因为在我的 QDialog 上,我不仅有垂直对齐的 QLabels(这只是我的 QDialog 的简化版本)。

QScrollArea 不会获得滚动条,除非里面的 QWidget 增长。仅仅将一些QLabels移出界外并不能使父QWidget增长,尤其是在没有QLayout的情况下。

但是,如果您手动调整它们的大小,使QWidget大于QScrollAreay,您将获得预期的滚动条:

QDialog *window = new QDialog;
window->resize(300, 600); //< 600px high widget
for(int i = 0; i < 50; ++i)
{
    QLabel *label = new QLabel(window);
    label->move(10, i * 15);
    label->setText("Text");
}
QScrollArea *area = new QScrollArea;
area->setWidget(window);
area->resize(300,300); //< Inside a 300px high scrollarea, expect scrollbars!
area->show();

请注意,现在您将拥有两个滚动条,因为垂直滚动条意味着没有足够的空间容纳我们的 300px 宽度。您可以使用area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);强行隐藏水平滚动条

您也可以始终强制垂直滚动条与area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);一起显示,但这本身并不能解决您的问题。在 300px 的区域内,您仍然有一个 300px 的小部件,并且滚动条没有任何空间可以移动。

确保QWidget足够大,可以容纳它所包含的所有内容,这是你想要做的,QScrollArea会适应。通常我们使用布局,但您也可以手动使其工作。