Класс 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);