автоматически удаляет виджеты, поэтому ваш деструктор пуст:
ButtonWindow::~ButtonWindow {}
5. Затем реализация слота:
void ButtonWindow::Clicked(void) {
std::cout << "clicked!\n";
}
6. И наконец, в функции
main
вы просто создаете экземпляр типа
ButtonWindow
, делаете его главным окном вашего приложения и отображаете окно на экране:
int main(int argc, char **argv) {
QApplication app(argc, argv);
ButtonWindow *window = new ButtonWindow;
app.setMainWidget(window);
window->show;
return app.exec;
}
7. Прежде чем вы сможете откомпилировать данный пример, необходимо запустить препроцессор для заголовочного файла. Программа этого препроцессора называется Meta Object Compiler (moc, компилятор метаобъекта) и должна быть включена в пакет комплекта Qt. Выполните
moc
для файла ButtonWindow.h, сохранив результат в файле ButtonWindow.moc:
$ moc ButtonWindow.h -о ButtonWindow.moc
Теперь можно компилировать как обычно, скомпоновав с результатом команды
Первый аргумент — текст метки кнопки, далее родительский виджет и последний аргумент — имя кнопки, обычно применяемое Qt для внутренних операций.
Параметр родительского виджета, общий для всех объектов, —
QWidget
, он управляет отображением и уничтожением и разными другими свойствами. Передача
NULL
в качестве родительского объекта означает виджет верхнего уровня, при этом создается содержащее его пустое окно. В примере
вы передаете текущий объект
ButtonWindow
с помощью ключевого слова
this
, что приводит к вставке кнопки в основную область окна
ButtonWindow
.
Аргумент
name
задает имя виджета для внутреннего использования Qt. Если комплект Qt обнаружит ошибку, имя виджета будет выведено в сообщении об ошибке, поэтому неплохо выбирать подходящие имена виджетов, поскольку при отладке это сбережет массу времени.
Вы могли заметить, что объект
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
— невидимые объекты-контейнеры, хранящие другие виджеты и схемы размещения с вертикальной и горизонтальной ориентациями соответственно. Вы сможете создавать сколь угодно сложные компоновки виджетов, поскольку допускается использование вложенных компоновок, например, за счет вставки как элемента горизонтальной схемы размещения внутрь вертикального упаковочного контейнера.