Параметры 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:
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");
QLabel* label3 = new QLabel("Right", widget, "textLabel3");
vertical->addwidget(label1);
vertical->addwidget(label2);
horizontal->addLayout(vertical);
horizontal->addWidget(label3);
resize(150, 100);
}
LayoutWindow::~LayoutWindow() { }
int main(int argc, char **argv) {
QApplication app(argc, argv);
LayoutWindow *window = new LayoutWindow();
app.setMainWidget(window);
window->show();
return app.exec();
}
Как и прежде, перед компиляцией нужно выполнить moc
для заголовочного файла:
$ moc LayoutWindow.h -о LayoutWindow.moc
$ g++ -о layout LayoutWindow.cpp -I$QTDIR/include -L$QTDIR/lib -lqui
Выполнив эту программу, вы получите схему размещения ваших меток QLabel (рис. 17.4). Попробуйте изменить величину окна и посмотрите, как расширяются и сжимаются метки, заполняя все доступное пространство.
Рис. 17.4
Как это работает
Программа LayoutWindow.cpp создает два виджета упаковочных контейнеров, горизонтальный и вертикальный контейнер для размещения виджетов. Вертикальный контейнер получает две метки, описанные, соответственно, как Top
и Bottom
. Горизонтальный контейнер также содержит два виджета, метку, обозначенную Right
, и вертикальный контейнер. Вы можете помещать компоновочные виджеты внутрь других компоновочных виджетов, как показано в данном примере.
Попробуйте изменить исходный текст программы в файле LayoutWindow.срр, чтобы поэкспериментировать и лучше понять, как работают компоновочные виджеты.
Мы рассмотрели основы применения Qt — сигналы и слоты, команду moc и средства компоновки. Теперь пора более внимательно изучить виджеты.
Для каждого случая в Qt есть виджеты, и их подробное рассмотрение займет всю оставшуюся часть книги. В этом разделе мы познакомимся с виджетами Qt общего применения, включая виджеты для ввода данных, кнопки, обычные и раскрывающиеся списки.