Qt
Об использовании макетов, родительский учет виджета
Поиск…
Вступление
Макеты необходимы в каждом приложении Qt. Они управляют объектом, их положением, их размером, как они изменяются.
замечания
Из документации по размещению Qt :
Когда вы используете макет, вам не нужно передавать родительский элемент при создании дочерних виджетов. Макет автоматически отобразит виджеты (используя QWidget :: setParent ()), чтобы они были дочерними элементами виджета, на котором установлен макет.
Ну действуй :
QGroupBox *box = new QGroupBox("Information:", widget);
layout->addWidget(box);
или выполните:
QGroupBox *box = new QGroupBox("Information:", nullptr);
layout->addWidget(box);
точно такая же.
Основной горизонтальный макет
Горизонтальная компоновка настраивает объект внутри него по горизонтали.
базовый код:
#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QHBoxLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *widget = new QWidget(&window);
QHBoxLayout *layout = new QHBoxLayout(widget);
window.setCentralWidget(widget);
widget->setLayout(layout);
layout->addWidget(new QPushButton("hello world", widget));
layout->addWidget(new QPushButton("I would like to have a layout !", widget));
layout->addWidget(new QPushButton("layouts are so great !", widget));
window.show();
return a.exec();
}
это выведет:
Базовая вертикальная компоновка
Вертикальная компоновка настраивает объект внутри вертикально.
#include "mainwindow.h"
#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *widget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(widget);
window.setCentralWidget(widget);
widget->setLayout(layout);
layout->addWidget(new QPushButton("hello world", widget));
layout->addWidget(new QPushButton("I would like to have a layout !", widget));
layout->addWidget(new QPushButton("layouts are so great !", widget));
window.show();
return a.exec();
}
выход:
Объединение макетов
Вы можете комбинировать малиновый макет с помощью других QWidgets в своем главном макете, чтобы делать больше специфических эффектов, таких как информационное поле: например:
#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QGroupBox>
#include <QTextEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *widget = new QWidget(&window);
QVBoxLayout *layout = new QVBoxLayout(widget);
window.setCentralWidget(widget);
widget->setLayout(layout);
QGroupBox *box = new QGroupBox("Information:", widget);
QVBoxLayout *boxLayout = new QVBoxLayout(box);
layout->addWidget(box);
QWidget* nameWidget = new QWidget(box);
QWidget* ageWidget = new QWidget(box);
QWidget* addressWidget = new QWidget(box);
boxLayout->addWidget(nameWidget);
boxLayout->addWidget(ageWidget);
boxLayout->addWidget(addressWidget);
QHBoxLayout *nameLayout = new QHBoxLayout(nameWidget);
nameLayout->addWidget(new QLabel("Name:"));
nameLayout->addWidget(new QLineEdit(nameWidget));
QHBoxLayout *ageLayout = new QHBoxLayout(ageWidget);
ageLayout->addWidget(new QLabel("Age:"));
ageLayout->addWidget(new QLineEdit(ageWidget));
QHBoxLayout *addressLayout = new QHBoxLayout(addressWidget);
addressLayout->addWidget(new QLabel("Address:"));
addressLayout->addWidget(new QLineEdit(addressWidget));
QWidget* validateWidget = new QWidget(widget);
QHBoxLayout *validateLayout = new QHBoxLayout(validateWidget);
validateLayout->addWidget(new QPushButton("Validate", validateWidget));
validateLayout->addWidget(new QPushButton("Reset", validateWidget));
validateLayout->addWidget(new QPushButton("Cancel", validateWidget));
layout->addWidget(validateWidget);
window.show();
return a.exec();
}
выведет:
Пример компоновки сетки
Макет сетки - это мощный макет, с помощью которого вы можете выполнить горизонтальную и вертикальную компоновку один раз.
пример:
#include "mainwindow.h"
#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QGroupBox>
#include <QTextEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow window;
QWidget *widget = new QWidget(&window);
QGridLayout *layout = new QGridLayout(widget);
window.setCentralWidget(widget);
widget->setLayout(layout);
QGroupBox *box = new QGroupBox("Information:", widget);
layout->addWidget(box, 0, 0);
QVBoxLayout *boxLayout = new QVBoxLayout(box);
QWidget* nameWidget = new QWidget(box);
QWidget* ageWidget = new QWidget(box);
QWidget* addressWidget = new QWidget(box);
boxLayout->addWidget(nameWidget);
boxLayout->addWidget(ageWidget);
boxLayout->addWidget(addressWidget);
QHBoxLayout *nameLayout = new QHBoxLayout(nameWidget);
nameLayout->addWidget(new QLabel("Name:"));
nameLayout->addWidget(new QLineEdit(nameWidget));
QHBoxLayout *ageLayout = new QHBoxLayout(ageWidget);
ageLayout->addWidget(new QLabel("Age:"));
ageLayout->addWidget(new QLineEdit(ageWidget));
QHBoxLayout *addressLayout = new QHBoxLayout(addressWidget);
addressLayout->addWidget(new QLabel("Address:"));
addressLayout->addWidget(new QLineEdit(addressWidget));
layout->addWidget(new QPushButton("Validate", widget), 1, 0);
layout->addWidget(new QPushButton("Reset", widget), 1, 1);
layout->addWidget(new QPushButton("Cancel", widget), 1, 2);
window.show();
return a.exec();
}
дать :
поэтому вы можете видеть, что поле группы находится только в первом столбце и первой строке, так как addWidget был layout->addWidget(box, 0, 0);
Однако, если вы измените его на layout->addWidget(box, 0, 0, 1, 3);
, новые 0 и 3 представляют, сколько строк и столбцов вы хотите для своего виджетов, чтобы они давали:
точно так же, как вы создали горизонтальный, а затем вертикальный макет в подвиде.