QScrollArea垂直滚动问题

时间:2015-01-11 00:36:07

标签: c++ qt vertical-scrolling

我看过几页有关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中我没有垂直对齐的QLabel(这只是我的QDialog的简化版本)。

1 个答案:

答案 0 :(得分:2)

除非内部的QWidget增长,否则QScrollArea不会获得滚动条。只是将一些QLabel移出界限不会使父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会适应。通常我们会使用布局,但您也可以手动使用它。