QScrollArea:水平滚动条由垂直滚动条引起

时间:2018-10-29 12:03:01

标签: c++ qt qscrollarea

我有一个带有QScrollArea的简单对话框:

// Vertical container for the dialog
QVBoxLayout *cont = new QVBoxLayout;
this->setLayout(cont); //"this" is my derived QDialog class

// ScrollArea for iconFrame
QScrollArea *scroll = new QScrollArea;
cont->insertWidget(0, scroll );

// The frame to be added to the QScrollArea
QFrame *iconFrame = new QFrame;
scroll->setWidget(iconFrame);
scroll->setWidgetResizable(true);

// Grid layout for iconFrame
QGridLayout *grid = new QGridLayout;
iconFrame->setLayout(grid);

// Second child widget for the dialog
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
cont->insertWidget(1, buttonBox);

int maxcol = int(ceil(sqrt(numberOfButtons)));
if(maxcol > 6) maxcol = 6;
for(int i=0; i<numberOfButtons; i++)
{
    QPushButton *button= new QPushButton("My Button");
    button->setFixedSize(48, 48);

    int row = int(floor(i/maxcol));
    grid->addWidget(button, row, i-row*maxcol);
}

由于最多有6列,因此框架和对话框垂直增长。

它能按预期工作,只是水平滚动条是由于垂直滚动条增加了宽度而绘制的。

我尝试了sizePolicies和sizeConstraints的不同组合,但是似乎没有任何效果。

如何摆脱水平滚动条?

2 个答案:

答案 0 :(得分:1)

您可以使用滚动条策略禁止滚动条:

scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

请注意,内容可能会被剪切。

对于滚动区域将有更多可用空间的情况,您可以尝试widgetResizable

scroll->setWidgetResizable(true);

答案 1 :(得分:0)

与其说是解决方案,不如说是一种解决方法,但是它可行。

iconFrame->adjustSize(); // Only necessary when contents of iconFrame have changed
if(iconFrame->height() > scroll->height())
    scroll->setMinimumWidth(iconFrame->width()+scroll->verticalScrollBar()->height());