Класс QGridLayout позволяет организовать сетку виджетов. Для этого он определяет ряд методов, основные из них:
QRect cellRect(int row, int column): получает ячейку грида, которая находится на пересечении строки row и столбца column
int columnCount(): возвращает количество столбцов
int columnMinimumWidth(int column): возвращает минимальную ширину столбца
int columnStretch(int column): возвращает фактор растяжения столбца
int horizontalSpacing(): возвращает горизонтальнае отступы между элементами
int rowCount(): возвращает количество строк
int rowMinimumHeight(int row): устанавливает минимальную высоту строки
int rowStretch(int row): возвращает растяжение строки
void setColumnMinimumWidth(int column, int minSize): устанавливает минимальную ширину столбца
void setColumnStretch(int column, int stretch): устанавливает растяжение столбца
void setHorizontalSpacing(int spacing): устанавливает горизонтальные отступы между элементами
void setOriginCorner(Qt::Corner corner): устанавливает начальную точку сетки
void setRowMinimumHeight(int row, int minSize): устанавливает минимальную высоту строки
void setRowStretch(int row, int stretch): устанавливает растяжение строки
void setVerticalSpacing(int spacing): устанавливает вертикальные отступы между элементами
int verticalSpacing(): возвращает вертикальные отступы между элементами
Кроме того, класс QGridLayout переопределяет метод addWidget(), позволяя настроить расположение виджета при добавлении:
void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment()) void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
Первая версия метода добавляет виджет widget в ячейку, которая находится в строке с индексом row и столбце с индексом column. И также позволяет установить выравнивание виджета в ячейке.
Вторая версия позволяет растянуть виджет на несколько ячеек. Для этого с помощью параметра fromRow можно указать индекс начальной строки, а с помощью rowSpan - количество строк, на которые растягивается виджет. Аналогично параметр fromColumn устанавливает индекс начального столбца, а columnSpan - количество столбцов, на которые растягивается виджет.
По умолчанию при добавлении каждый виджет помещается на новую строку:
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget* widget = new QWidget;
widget -> setWindowTitle("METANIT.COM");
widget->setMinimumWidth(250);
widget->setMinimumHeight(150);
QPushButton *btn1 = new QPushButton("Button 1");
QPushButton *btn2 = new QPushButton("Button 2");
QPushButton *btn3 = new QPushButton("Button 3");
QGridLayout *layout = new QGridLayout(widget);
layout->addWidget(btn1);
layout->addWidget(btn2);
layout->addWidget(btn3);
widget->show();
return app.exec();
}
Теперь добавим кнопки в определенные строки и столбцы:
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget* widget = new QWidget;
widget -> setWindowTitle("METANIT.COM");
widget->setMinimumWidth(250);
widget->setMinimumHeight(150);
QPushButton *btn1 = new QPushButton("Button 1");
QPushButton *btn2 = new QPushButton("Button 2");
QPushButton *btn3 = new QPushButton("Button 3");
QGridLayout *layout = new QGridLayout(widget);
layout->addWidget(btn1,0,0);
layout->addWidget(btn2,0, 1);
layout->addWidget(btn3, 1,1);
widget->show();
return app.exec();
}
Здесь первая кнопка добавляется в самую первую ячейку (строка и столбец с индексом 0). Вторая кнопка добавляется в строку с индексом 0 и столбец с индексом 1. Третья кнопка добавляется в во вторую строку и второй столбец.
То есть в итоге у нас получается две строки и два столбца, которые образуют четыре ячейки. Три виджета занимают каждый свою ячейку, поэтому одна ячейка остается незанятой.
Теперь используем другую версию метода addWidget() и растянем третью кнопку на два столбца:
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget* widget = new QWidget;
widget -> setWindowTitle("METANIT.COM");
widget->setMinimumWidth(250);
widget->setMinimumHeight(150);
QPushButton *btn1 = new QPushButton("Button 1");
QPushButton *btn2 = new QPushButton("Button 2");
QPushButton *btn3 = new QPushButton("Button 3");
QGridLayout *layout = new QGridLayout(widget);
layout->addWidget(btn1,0,0);
layout->addWidget(btn2,0, 1);
layout->addWidget(btn3, 1,0,1,2);
widget->show();
return app.exec();
}
Здесь третья кнопка помещается в ячейку на пересечении второй строки и первого столбца и растягивается на 1 строку (то есть по факту не растягивается) и на 2 столбца:
layout->addWidget(btn3, 1,0,1,2);