Qt:Документация 4.3.2/layouts-basiclayouts

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
40px Внимание: Актуальная версия перевода документации находится здесь

__NOTOC__

Image:qt-logo.png

Главная · Все классы · Основные классы · Классы по группам · Модули · Функции

Image:trolltech-logo.png

[править] Пример Basic Layouts

Файлы:

Пример Basic Layouts показывает, как использовать стандартные менеджеры компоновки, доступные в Qt: QBoxLayout и QGridLayout.

center

Класс QBoxLayout располагает виджеты в линию, горизонтально или вертикально. QHBoxLayout и QVBoxLayout - удобные потомки класса QBoxLayout.

[править] Определение класса диалога

 class Dialog : public QDialog
 {
     Q_OBJECT
 
 public:
     Dialog();
 
 private:
     void createMenu();
     void createHorizontalGroupBox();
     void createGridGroupBox();
 
     enum { NumGridRows = 3, NumButtons = 4 };
 
     QMenuBar *menuBar;
     QGroupBox *horizontalGroupBox;
     QGroupBox *gridGroupBox;
     QTextEdit *smallEditor;
     QTextEdit *bigEditor;
     QLabel *labels[NumGridRows];
     QLineEdit *lineEdits[NumGridRows];
     QPushButton *buttons[NumButtons];
     QDialogButtonBox *buttonBox;
 
     QMenu *fileMenu;
     QAction *exitAction;
 };

Класс Dialog наследует QDialog. Это пользовательский виджет, который отображает свои виджеты-потомки в помощью менеджеров размера: QHBoxLayout, QVBoxLayout и QGridLayout.

Мы объявили три закрытые функции для упрощения конструктора класса: функции createMenu(), createHorizontalGroupBox() и createGridGroupBox() создают несколько виджетов, которые используются в примере для демонстрации вариантов компоновки.

[править] Dialog Class Implementation

 Dialog::Dialog()
 {
     createMenu();
     createHorizontalGroupBox();
     createGridGroupBox();

В конструкторе мы сначала использовали фукнцию createMenu() для создания и заполнения строки меню, функцию createHorizontalGroupBox() для создания группы из четырёх кнопок, размещённых горизонтально с помощью горизонтальной компоновки, затем использовали функцию createGridGroupBox() для создания группы элементов, состоящей из нескольких полей ввода, расположенных по сетке.

     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 берёт пространство оттуда, откуда он запускается (от его предка-компоновщика или родительского виджета), делит полученное место на ряд областей и заносит в каждый виджет в одну область. If the QBoxLayout's orientation is Qt::Horizontal the boxes are placed in a row. If the orientation is Qt::Vertical, the boxes are placed in a column. The corresponding convenience classes are QHBoxLayout and QVBoxLayout, respectively.

     mainLayout->setMenuBar(menuBar);

When we call the QLayout::setMenuBar() function, the layout places the provided menu bar at the top of the parent widget, and outside the widget's content margins. All child widgets are placed below the bottom edge of the menu bar.

     mainLayout->addWidget(horizontalGroupBox);
     mainLayout->addWidget(gridGroupBox);
     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"));

In the createGridGroupBox() function we use a QGridLayout which lays out widgets in a grid. It takes the space made available to it (by its parent layout or by the parent widget), divides it up into rows and columns, and puts each widget it manages into the correct cell.

     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);
     }

For each row in the grid we create a label and an associated line edit, and add them to the layout. The QGridLayout::addWidget() function differ from the corresponding function in QBoxLayout: It needs the row and column specifying the grid cell to put the widget in.

     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() can in addition take arguments specifying the number of rows and columns the cell will be spanning. In this example, we create a small editor which spans three rows and one column.

For both the QBoxLayout::addWidget() and QGridLayout::addWidget() functions it is also possible to add a last argument specifying the widget's alignment. By default it fills the whole cell. But we could, for example, align a widget with the right edge by specifying the alignment to be Qt::AlignRight.

     layout->setColumnStretch(1, 10);
     layout->setColumnStretch(2, 20);
     gridGroupBox->setLayout(layout);
 }

Каждый столбец в таблице имеет растягивающий фактор. Растягивающий фактор устанавливается с помощью QGridLayout::setColumnStretch() и определяет, сколько доступного пространства будет предоставляться столбцам выше необходимого минимума.

В этом примере мы устанавливали факторы растяжения для стобцов 1 и 2. Фактор растяжения определяется в зависимости от других столбцов таблицы; столбцы с более высоким значением занимают больше доступного места. Потому столбец 2 в нашем случае получит больше доступного пространства, чем 1, а столбец 0 не будет увеличиваться, так как его фактор растяжения равен 0 (по умолчанию).

Столбцы и строки ведут себя одинаково; по аналогии, фактор растяжения для строк может быть установлен с помощью QGridLayout::setRowStretch().



Copyright © 2007 Trolltech Trademarks
Qt 4.3.2