Пример "Basic Layouts"Файлы:
Пример "Basic Layouts" показывает, как использовать стандартные менеджеры компоновки, доступные в Qt: QBoxLayout, QGridLayout и QFormLayout. Класс QBoxLayout располагает виджеты в линию, горизонтально или вертикально. QHBoxLayout и QVBoxLayout - вспомогательные потомки класса QBoxLayout. QGridLayout размещает виджеты в ячейках, разделяя доступное место на строки и столбцы. QFormLayout, с другой стороны, размещает своих детей в форме с двумя столбцами с метками в левом столбце и полями ввода в правом столбце. Определение класса диалогаclass Dialog : public QDialog { Q_OBJECT public: Dialog(); private: void createMenu(); void createHorizontalGroupBox(); void createGridGroupBox(); void createFormGroupBox(); enum { NumGridRows = 3, NumButtons = 4 }; QMenuBar *menuBar; QGroupBox *horizontalGroupBox; QGroupBox *gridGroupBox; QGroupBox *formGroupBox; QTextEdit *smallEditor; QTextEdit *bigEditor; QLabel *labels[NumGridRows]; QLineEdit *lineEdits[NumGridRows]; QPushButton *buttons[NumButtons]; QDialogButtonBox *buttonBox; QMenu *fileMenu; QAction *exitAction; }; Класс Dialog наследует QDialog. Это пользовательский виджет, который отображает свои виджеты-потомки с помощью менеджеров размера: QHBoxLayout, QVBoxLayout, QGridLayout и QFormLayout. Мы объявили четыре закрытые функции для упрощения конструктора класса: функции createMenu(), createHorizontalGroupBox(), createGridGroupBox() и createFormGroupBox() создают несколько виджетов, которые используются в примере для демонстрации вариантов компоновки. Реализация класса Dialog Dialog::Dialog()
{
createMenu();
createHorizontalGroupBox();
createGridGroupBox();
createFormGroupBox();
В конструкторе мы сначала использовали функцию createMenu() для создания и заполнения строки меню и функцию createHorizontalGroupBox() для создания группы из четырёх кнопок с горизонтальным размещением. Далее мы использовали функцию createGridGroupBox() для создания группы элементов, состоящей из нескольких полей ввода и маленького текстового редактора, которые отображаются в компоновщике по сетке. Наконец, мы использовали функцию createFormGroupBox() для создания групповой рамки с тремя метками и тремя полями ввода: однострочным редактором, выпадающим списком и счётчиком. bigEditor = new QTextEdit; bigEditor->setPlainText(tr("This widget takes up all the remaining space " "in the top-level layout.")); buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); Мы также создали большой редактор текста и кнопку диалогового окна. Класс QDialogButtonBox является виджетом, который представляет кнопки в компоновщике, которые относятся к текущему стилю виджета. Предпочтительные кнопки можно указать в качестве параметров в конструкторе, используя перечисление QDialogButtonBox::StandardButtons. Помните, что мы не должны указывать родителей при создании элементов. Причина этого в том, что когда все виджеты будут добавлены в компоновщик, он автоматически станет их предком. QVBoxLayout *mainLayout = new QVBoxLayout; Главный компоновщик - объект QVBoxLayout. QVBoxLayout - вспомогательный класс для группового вывода с вертикальной ориентацией. В основном, класс QBoxLayout берёт пространство оттуда, откуда он запускается (от его предка-компоновщика или родительского виджета), делит полученное место на ряд областей и заносит каждый виджет в одну область. Если ориентация QBoxLayout равна Qt::Horizontal, то поля размещаются в строке. Если ориентация равна Qt::Vertical, то поля размещаются в столбце. Соответствующими вспомогательными классами являются QHBoxLayout и QVBoxLayout. mainLayout->setMenuBar(menuBar); Когда мы вызываем функцию QLayout::setMenuBar(), компоновщик размещает предоставленную панель меню сверху родительского виджета и вне полей содержимого виджета. Все дочерние виджеты помещаются под нижнем краем панели меню. mainLayout->addWidget(horizontalGroupBox); mainLayout->addWidget(gridGroupBox); mainLayout->addWidget(formGroupBox); mainLayout->addWidget(bigEditor); mainLayout->addWidget(buttonBox); Мы используем функцию QBoxLayout::addWidget() для добавления виджетов в конец компоновщика. Каждый виджет получит по крайней мере свой минимальный размер, но не более своего максимального размера. Можно указать коэффициент растяжения в функции addWidget(), и любое освободившееся место будет распределено в соответствии с этим параметром. Если не указано, то коэффициент растяжения равен 0. setLayout(mainLayout);
setWindowTitle(tr("Basic Layouts"));
}
Мы устанавливаем главный компоновщик виджета Dialog с помощью функции QWidget::setLayout(), и все виджеты компоновщика автоматически становятся потомками виджета Dialog. void Dialog::createMenu() { menuBar = new QMenuBar; fileMenu = new QMenu(tr("&File"), this); exitAction = fileMenu->addAction(tr("E&xit")); menuBar->addMenu(fileMenu); connect(exitAction, SIGNAL(triggered()), this, SLOT(accept())); } В закрытой функции createMenu() мы создаём строку меню и добавляем в неё выпадающее меню File, содержащее пункт Exit. void Dialog::createHorizontalGroupBox() { horizontalGroupBox = new QGroupBox(tr("Horizontal layout")); QHBoxLayout *layout = new QHBoxLayout; for (int i = 0; i < NumButtons; ++i) { buttons[i] = new QPushButton(tr("Button %1").arg(i + 1)); layout->addWidget(buttons[i]); } horizontalGroupBox->setLayout(layout); } Когда мы создаём группу горизонтально расположенных элементов, мы используем QHBoxLayout в качестве внутреннего компоновщика. Мы создаём кнопки, которые мы хотим поместить в компоновщик, добавляем их и устанавливаем компоновщик для отображения. void Dialog::createGridGroupBox() { gridGroupBox = new QGroupBox(tr("Grid layout")); В функци createGridGroupBox() мы используем QGridLayout, который располагает виджеты в сетке. Она занимает доступное ей пространство (предоставленное его родительской компоновкой или родительским виджетом), разделяя её на строки и столбцы, а также помещает каждый виджет в правильную ячейку. for (int i = 0; i < NumGridRows; ++i) { labels[i] = new QLabel(tr("Line %1:").arg(i + 1)); lineEdits[i] = new QLineEdit; layout->addWidget(labels[i], i + 1, 0); layout->addWidget(lineEdits[i], i + 1, 1); } Для каждой строки в сетке мы создаём метку и связанный однострочный редактор и добавляем их в компоновщик. Функция QGridLayout::addWidget() отличается от соответствующей функции в QBoxLayout: ей нужны строка и столбец, указывающие ячейку сетки для добавления в неё виджета. smallEditor = new QTextEdit; smallEditor->setPlainText(tr("This widget takes up about two thirds of the " "grid layout.")); layout->addWidget(smallEditor, 0, 2, 4, 1); QGridLayout::addWidget() может дополнительно принимать параметры, указывающие количество строк и столбцов, которые будут захвачены ячейкой. В этом примере мы создаём маленький редактор, захватывающий три строки и один столбец. Для обоих функций, QBoxLayout::addWidget() и QGridLayout::addWidget(), можно также добавить последний аргумент, указывающий выравнивание виджета. По умолчанию он заполняет всю ячейку. Но мы могли бы, например, выровнять виджет по правому краю, указав выравнивание Qt::AlignRight. layout->setColumnStretch(1, 10); layout->setColumnStretch(2, 20); gridGroupBox->setLayout(layout); } Каждый столбец в таблице имеет коэффициент растяжения. Коэффициент растяжения устанавливается с помощью QGridLayout::setColumnStretch() и определяет, сколько доступного пространства будет предоставляться столбцам выше необходимого минимума. В этом примере мы устанавливали коэффициенты растяжения для столбцов 1 и 2. Коэффициент растяжения определяется в зависимости от других столбцов таблицы; столбцы с более высоким значением занимают больше доступного места. Потому столбец 2 в нашем случае получит больше доступного пространства, чем 1, а столбец 0 не будет увеличиваться, так как его коэффициент растяжения равен 0 (по умолчанию). Столбцы и строки ведут себя одинаково; по аналогии, коэффициент растяжения для строк может быть установлен с помощью QGridLayout::setRowStretch(). void Dialog::createFormGroupBox() { formGroupBox = new QGroupBox(tr("Form layout")); QFormLayout *layout = new QFormLayout; layout->addRow(new QLabel(tr("Line 1:")), new QLineEdit); layout->addRow(new QLabel(tr("Line 2, long text:")), new QComboBox); layout->addRow(new QLabel(tr("Line 3:")), new QSpinBox); formGroupBox->setLayout(layout); } В функции createFormGroupBox() мы используем QFormLayout, чтобы аккуратно расположить объекты в два столбца - название и поле. Есть три объекта QLabel для названий с тремя соответствующими виджетами ввода в качестве полей: QLineEdit, QComboBox и QSpinBox. В отличие от QBoxLayout::addWidget() и QGridLayout::addWidget() мы используем QFormLayout::addRow() для добавления виджетов в компоновщик. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |