Параметр родительского виджета, общий для всех объектов, — QWidget
NULL
в качестве родительского объекта означает виджет верхнего уровня, при этом создается содержащее его пустое окно. В примере вы передаете текущий объект ButtonWindow
с помощью ключевого слова this
, что приводит к вставке кнопки в основную область окна ButtonWindow
.Аргумент name
Вы могли заметить, что объект 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.
QBoxLayout
В этом примере вы увидите в действии классы QBoxLayout
QLabel
в окне QMainWindow
.1. Сначала введите заголовочный файл LayoutWindow.h:
#include
class LayoutWindow : public QMainWindow {
QOBJECT
public: