Вы могли заметить, что объект QPushButtonочень примитивно вставляется в окно ButtonWindow, с помощью параметра parent конструктора QPushButton, без указания положения кнопки, ее размера, рамки или чего-либо еще. Если вы хотите управлять внешним видом кнопки, что очень важно для создания привлекательного интерфейса, следует применять виджеты компоновки комплекта Qt. Давайте их сейчас рассмотрим,
В Qt есть целый ряд способов размещения и компоновки виджетов. Вы уже видели использование абсолютных координат с помощью вызова setGeometry, но они редко применяются, поскольку виджеты не масштабируются и не меняют размеры при изменении величины окна.
Предпочтительный метод компоновки виджетов — применение классов QLayoutили виджетов-контейнеров, которые изменяют свои размеры соответствующим образом после задания им подсказок, касающихся отступов и расстояний между виджетами.
Ключевое различие между классами QLayoutи упаковочными контейнерами заключается в том, что объекты класса QLayout не являются виджетами.
Классы компоновки — потомки объектов, типа QObject, а не QWidget, поэтому их применение ограничено. Например, вы не можете создать объект QVBoxLayout— основной виджет объекта QMainWindow.
Виджеты упаковочных контейнеров (такие, как QHBoxи QVBox) напротив — потомки объекта типа QWidgetследовательно, вы можете применять их как обычные виджеты. Возможно, вас удивляет, что в Qt есть и классы QLayout, и виджеты QBoxс дублирующимися функциональными возможностями. На самом деле виджеты QBoxсуществуют только для удобства и по существу служат оболочкой классов QLayoutв типе QWidget. Объекты QLayoutобладают возможностью автоматического изменения размеров, в то время как размеры виджетов нужно изменять вручную с помощью вызова метода QWidget::resizeEvent().
Подклассы QLayout: QVBoxLayoutи QHBoxLayout, — самый распространенный способ создания интерфейса, и именно их вы будете чаще всего встречать в программном коде с применением Qt.
QVBoxLayoutи QHBoxLayout— невидимые объекты-контейнеры, хранящие другие виджеты и схемы размещения с вертикальной и горизонтальной ориентациями соответственно. Вы сможете создавать сколь угодно сложные компоновки виджетов, поскольку допускается использование вложенных компоновок, например, за счет вставки как элемента горизонтальной схемы размещения внутрь вертикального упаковочного контейнера.
Есть три конструктора QVBoxLayout, заслуживающих внимания (у объектов QHBoxLayoutидентичный API).
QVBoxLayout::QVBoxLayout(QWidget *parent, int margin, int spacing,
const char *name)
QVBoxLayout::QVBoxLayout(QLayout *parentLayout, int spacing,
const char * name)
QVBoxLayout::QVBoxLayout(int spacing, const char *name)
Родителем объекта QLayoutможет быть либо виджет, либо другой объект типа QLayout. Если не задавать родительский объект, вы сможете только вставить позже данную схему размещения в другой объект QLayoutс помощью метода addLayout.
Параметры margin и spacing задают пустое пространство в пикселах вокруг схемы размещения QLayoutи между отдельными виджетами в ней.
После создания вашей схемы размещения QLayoutвы можете вставлять дочерние виджеты или схемы с помощью следующей пары методов:
QBoxLayout::addWidget(QWidget *widget, int stretch = 0, int alignment = 0);
QBoxLayout::addLayout(QLayout *layout, int stretch = 0);
Выполните упражнение 17.3.
Упражнение 17.3. Применение классов QBoxLayout
В этом примере вы увидите в действии классы QBoxLayoutпри размещении виджетов QLabelв окне QMainWindow.
1. Сначала введите заголовочный файл LayoutWindow.h:
#include
class LayoutWindow : public QMainWindow {
QOBJECT
public:
LayoutWindow(QWidget *parent = 0, const char *name = 0);
virtual ~LayoutWindow();
};
2. Теперь введите реализацию в файл LayoutWindow.cpp:
#include
#include
#include
#include "LayoutWindow.moc"
LayoutWindow::LayoutWindow(QWidget* parent, const char *name) :
QMainWindow(parent, name) {
this->setCaption("Layouts");
3. Необходимо создать фиктивный QWidgetдля хранения объекта QHBoxLayout, поскольку его нельзя напрямую вставить в объект QMainWindow:
QWidget *widget = new QWidget(this);
setCentralWidget(widget);
QHBoxLayout *horizontal = new QHBoxLayout(widget, 5, 10, "horizontal");
QVBoxLayout *vertical = new QVBoxLayout();
QLabel* label1 = new QLabel("Top", widget, "textLabel1");
QLabel* label2 = new QLabel("Bottom", widget, "textLabel2");
Читать дальше