QScrollArea: горизонтальная полоса прокрутки, вызванная вертикальной полосой прокрутки - PullRequest
0 голосов
/ 29 октября 2018

У меня есть простой диалог с 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 голосов
/ 31 октября 2018

Не столько решение, сколько обходной путь, но оно работает.

iconFrame->adjustSize(); // Only necessary when contents of iconFrame have changed
if(iconFrame->height() > scroll->height())
    scroll->setMinimumWidth(iconFrame->width()+scroll->verticalScrollBar()->height());
0 голосов
/ 30 октября 2018

Вы можете подавить полосу прокрутки, используя политику полосы прокрутки:

scroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

Обратите внимание, что содержимое может быть обрезано.

Для случаев, когда в области прокрутки будет больше места, вы можете попробовать widgetResizable:

scroll->setWidgetResizable(true);
...