Я хочу иметь 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. Что я должен изменить, чтобы иметь поведение, которое я хочу? Является ли это возможным?
Это потому, что вы помещаете групповой блок в область прокрутки. Область прокрутки не ограничивает размер своих детей.
Вы должны сделать наоборот, поместите scrollarea в групповой блок. Вот как;
QWidget* sw = new QWidget();
sw->setLayout(gridLayout);
sa->setWidget(cont);
QVBoxLayout* bl = new QVBoxLayout(box);
bl->addWidget(sa);
setCentralWidget(box);
Обратите внимание, что если вы используете кнопки переключения (например, переключатель), они не будут действовать как группа. Потому что технически они больше не находятся в одном QGroupBox — они находятся внутри области прокрутки. Вы можете обеспечить групповое поведение, используя QButtonGroup
пример.
Других решений пока нет …