QScrollArea внутри QGroupBox, полосы прокрутки вместо изменения размера QGroupBox

Я хочу иметь QScrollArea внутри QGroupBox, поэтому, когда я добавляю новые виджеты в групповое поле, его размер остается прежним, но у меня есть полосы прокрутки вместо изменения размера самого группового окна.

Вот мой код:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QtCore>
#include <QtGui>
#include <QLayout>
#include <QScrollArea>
#include <QGroupBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QGroupBox *box = new QGroupBox(QObject::tr("Example"));
    QScrollArea *sa = new QScrollArea;

    QGridLayout *gridLayout = new QGridLayout;
    QPushButton *b1 = new QPushButton("A");
    QPushButton *b2 = new QPushButton("B");
    QPushButton *b3 = new QPushButton("C");
    QPushButton *b4 = new QPushButton("D");
    QPushButton *b5 = new QPushButton("E");
    QPushButton *b6 = new QPushButton("F");
    QPushButton *b7 = new QPushButton("F");
    QPushButton *b8 = new QPushButton("F");
    QPushButton *b9 = new QPushButton("F");

    // addWidget(*Widget, row, column, rowspan, colspan)
    // 0th row
    gridLayout->addWidget(b1,0,0,1,1);
    gridLayout->addWidget(b2,0,1,1,1);
    gridLayout->addWidget(b3,0,2,1,1);

    // 1st row
    gridLayout->addWidget(b4,1,0,1,1);

    // 2nd row with 2-column span
    gridLayout->addWidget(b5,2,0,1,2);

    // 3rd row with 3-column span
    gridLayout->addWidget(b6,3,0,1,3);

    gridLayout->addWidget(b7,4,0,1,3);

    gridLayout->addWidget(b8,5,0,1,3);

    gridLayout->addWidget(b9,6,0,1,3);

    box->setLayout(gridLayout);
    sa->setWidget(box);

    setCentralWidget(sa);
}

MainWindow::~MainWindow()
{
    delete ui;
}

Теперь у меня есть то, что каждый раз, когда я добавляю новый QPushButton, QGroupBox изменяет размер, нет никакого значения QScrollArea. Что мне нужно изменить, чтобы вести себя так, как я хочу? Является ли это возможным?


person mirx    schedule 15.11.2015    source источник


Ответы (1)


Это потому, что вы помещаете групповой ящик в область прокрутки. Область прокрутки не ограничивает ее детский размер.

Вы должны сделать наоборот, поместить область прокрутки внутри группового поля. Вот как

QWidget* sw = new QWidget();
sw->setLayout(gridLayout);
sa->setWidget(cont);
QVBoxLayout* bl = new QVBoxLayout(box);
bl->addWidget(sa);

setCentralWidget(box);

Обратите внимание, что если вы используете кнопки переключения (например, радио-кнопку), они не будут действовать как группа. Потому что технически они больше не находятся в одном QGroupBox - они находятся внутри области прокрутки. Вы можете указать поведение группы, используя экземпляр QButtonGroup.

person HeyYO    schedule 15.11.2015
comment
Изменил его, как вы предложили: pastie.org/private/n18c4xrsruu693io9x8r6g, но полосы прокрутки по-прежнему отсутствуют. Что я делаю не так? - person mirx; 15.11.2015
comment
Спасибо. Но возможно ли разместить, скажем, 2 или 3 QGroupBox один рядом с другим в макете сетки с QScrollArea внутри? Как-то не знаю, как это сделать. - person mirx; 16.11.2015
comment
Поскольку у вас будет несколько экземпляров этого класса, я предлагаю вам создать новый класс, наследующий QGroupBox, внести необходимые изменения в полосу прокрутки как часть этого класса. Так будет намного проще и чище. - person HeyYO; 16.11.2015