Next Previous Table of Contents

### 3. Сборка примеров Qt

### 3.1 Шаг первый: Hello World!

В предыдущей главе мы создали проект под названием `MyWidget` - теперь, глядя на первую страницу учебника по библиотеке Qt, вы можете заметить, что первое приложение использует только функцию `main()`. Поэтому мы изменим только имеющуюся функцию `main()` нашего проекта для создания и запуска первого шага учебника.

Для доступа к функции `main()` выберите в просмотрщике классов ветку "Глобальное", которая содержит подветку "Функции", где перечислены функции, не являющиеся методами классов. Это приведет к открытию файла `main.cpp` в окне "Файлы C/C++" и курсор будет установлен на первой строчке функции `main()`.

#### Что изменять первым

Мы можем начать изменять исходный текст, чтобы привести его к виду из учебника по Qt, но можно поступить проще. Отметьте содержимое функции `main()` с помощью мышки или нажимая стрелку вниз одновременно удерживая Shift. Затем выберите пункт "Вырезать" из меню "Редактирование" или нажмите кнопку DEL для удаления отмеченного куска текста. Таким образом мы удалим содержимое функции и сможем начать создавать наше учебное приложение с нуля.

#### Ввод исходного текста примера

Теперь, для того чтобы ввести исходный текст из учебника, вы сначала можете внимательно его прочитать и постараться запомнить какая строка содержит какой текст. Затем, после прочтения в учебники описания каждой строки, вы можете использовать его в качестве пособия при написании собственного примера.

Для желающих пойти более простым путем: отметьте содержимое приведенной функции `main()` в просмотрщике документации и нажмите кнопку "Копировать" на панели инструментов. Также вы можете использовать контекстное меню или соответствующий пункт в меню "Редактирование". Это приведет к копированию отмеченного текста в буфер обмена, который, после переключения обратно в окно редактирования исходного текста, может быть выставлен с помощью кнопки или пунктов контекстного или основного меню "Вставить".

Наконец, вставьте следующие файлы заголовков перед функцией `main()`:

> `

>     #include <qapplication.h>
>     #include <qpushbutton.h>

> `

Вот и все ! Мы получили исходный текст вашего первого учебного приложения.

#### Сборка Hello World!

Для сборки вашего первого учебного приложения выберите пункт "Создать" в меню "Собрать" или нажмите соответствующую кнопку на панели инструментов. Также вы можете выбрать пункт "Исполнить", в результате чего произойдет запуск приложения после его успешной сборки.

Если сборка прервана из-за ошибки, будте уверены - это ошибка программиста, а не учебника ! Конечно печально начинать программирование под KDE/Qt с поисков ошибки, но таким образом вы сможете потренироваться в использовании KDevelop. Для того, чтобы найти ошибку, вы можете выбрать два пути: или, шелкнув на сообщении об ошибке в окне вывода, оказаться на той строчке, где эта ошибка произошла, или нажать клавишу F4; также вы можете использовать пункт "Следующая ошибка" меню "Вид".

#### Упражнения

Вы можете спросить - "Упражнения ? Да этот пример настолько прост, что мне не нужны никакие упражнения !", но будте уверены, все еще успеет усложниться. Это был простейший пример, но чем сложнее они будут становиться, тем больше придется думать, чтобы понять и следовать шагам учебника. Упражнения также помогут вам освоиться с KDevelop и его возможностями.

В качестве упражнения с первым учебным примером, попробуйте внести следующие изменения в приведенный исходный текст и посмотреть, как это повлияет на поведение приложения:

1. замените pushbutton на QLabel.
2. используйте `setText()` вместо непосредственного указания текста в конструкторе pushbutton.
3. используйте `QPushButton::resize ( const QSize & s )` вместо установки размеров с помощью непосредственного указания ширины и высоты. Сначала создатейте объект класса `QSize`, содержащий эти размеры.
4. поизменяйте размеры, чтобы разобраться какой параметр высота, а какой ширина.

### 3.2 Шаги 2 и 3: Расширения

Шаги учебника 2 и 3 расширяют возможности первого учебного примера. Здесь вы узнаете о слотах и сигналах, а также о зависимости родитель-потомок между визуальными элементами.

И почему же так важно знать об этом? Потому, что механизм слотов и сигналов является отличительной чертой библиотеки Qt от любых других библиотек визуальных элементов. Когда у вас возникает проблема в реализации механизма коммуникации между объектами, ничто не сделает вашу работу столь короткой, как механизм слотов и сигналов. Даже ошибочные связи не приведут к выходу по ошибке сегментации(segmentation fault). Этот механизм является сильной стороной библиотеки QT, и поэтому множество разработчиков KDE/QT приложений не хотят от него отказываться из-за его гибкости. Понимание функционирования этого механизма необходимо для создания любого KDE/Qt приложения.

Также необходимо обратить внимание на то, что кнопка, которая вызывает уничтожение объекта `QApplication`, вызывает функцию `quit()`. Далее мы встретимся с функцией `quit()`, когда будем работать с аналогом `QApplication` в KDE - `KApplication`.

### 3.3 Создание ваших собственных визуальных элементов

Теперь, после успешного изменения и усложнения функции `main()`, можно переходить к созданию нового собственного визуального элемента - уникального визуального элемента, который может быть создан только конструктором класса, который мы разработаем на шаге 4. На самом деле класс уже создан мастером приложений, поэтому осталось добавить совсем чуть-чуть - добавить исходные тексты из урока 4,находящиеся в файле `main.cpp`, в файлы описания и определения класса `MyWidget`. К счастью, нам надо всего лишь внести изменения в конструктор класса.

Выберите конструктор класса в окне просмотрщика классов и попадете на строку с его описанием. Сюда и надо будет добавлять исходные тексты.

Здесь вам надо будет проследить за подключением файла заголовков `qfont.h`, `QFont` используется только в конструкторе класса `MyWidget`. Поэтому добавьте строку `#include <qfont.h>` в начало файла `mywidget.cpp`.

Для запуска нового приложения нажмите кнопку "Исполнить". В результате произойдет компиляция измененных файлов после их автоматической записи.

### 3.4 Расширение класса Widget

Теперь, в уроке 5 нашей целью будет расширение возможностей класса. Также вы узнаете о виртуальных функциях. Здесь переписывается метод `resizeEvent()`. Главное, что необходимо запомнить здесь (помимо расширения возможностей класса), это то, что Qt работает с пользовательскими событиями посредством виртуальных функций, которые принимают событие в качестве параметра. Поэтому вы должны ознакомиться со следующими классами библиотеки Qt:

- QEvent
- QChildEvent
- QCloseEvent
- QFocusEvent
- QKeyEvent
- QMouseEvent
- QMoveEvent
- QPaintEvent
- QResizeEvent
- QTimerEvent

Когда вы будете разрабатывать собственные визуальные элементы, особенно окна вывода приложений, вам придется переписывать методы обработки событий, наследуемые классами визуальных элементов по-умолчанию, заменяя обработку тех событий, которые вам нужно перехватить. Это может быть, например,

`virtual void mousePressEvent ( QMouseEvent * )` для обработки сигналов от мышки для вывода контекстного меню. При создании собственного обработчика, вам необходимо будет вставить формальный параметр в описание функции, большинство разработчиков используют `event` или `e` в качестве имени параметра.

Теперь вы сможете обрабатывать параметры события. Для `QMouseEvent` вам надо будет выяснить какая из кнопок, правая, средняя или левая, породила событие.

### 3.5 Добавление нового класса

В уроке номер 6 вам предстоит добавить класс в ваше учебное приложение. Теперь вы наверное думаете - "Вот сейчас создам файлы определения и описания - и все", но KDevelop предоставляет вам более простой способ. Когда вы создаете класс, вы всегда должны использовать Создатель Классов. Он возьмет все вышеописанные обязанности на себя, а вам останется лишь добавить необходимые тексты.

Для того, чтобы добавить класс с помощью Создателя Классов, выберите пункт "Новый Класс" в меню "Проекты", в результате появится диалоговое окно, поля которого надо будет заполнить необходимыми значениями. Сначала введем имя класса. В учебнике фигурирует имя `LCDRange`. Затем укажем базовый класс. Свойства нового класса будут унаследованы от базового класса. В учебнике (по Qt 1.42) таковым является `QWidget`. Т.к. большинство добавляемых классов наследуются от QWidget, то мы можем не заполнять это поле, а просто пометить кнопочку "потомок класса QWidget" в секции "Дополнительные параметры". Это приведет к автоматическому добавлению макроса `Q_OBJECT` в файл определения для добавления слотов и сигналов в дальнейшем (это понадобиться в главе 7).

Т.к. имена файлов подставляются автоматически, вам не нужно об этом беспокоиться. Единственное, что мы можем посоветовать добавить - это документация. Всегда считалось хорошим стилем прилагать подробное описание к классу, особенно когда, например, имя класса `LCDRange` не наводит на мысли о его предназначении.

### 3.6 Шаги 7-14

Теперь вы все знаете и готовы к остальным шагам учебника. Вам всего лишь нужно добавлять необходимые классы и вносить соответствующие изменения.

После каждого изменения вам нужно заново пересобрать проект и посмотреть, нет ли в нем ошибок. Запустите приложение и проследите за его выполнением; дополнительно, вы можете поизменять опции KDevelop в меню "Собрать" - выполнить приложение с аргументом командной строки, таким как '--geometry', и отладить его с помощью Отладчика в окне Инструментов. После этого вы будете в состоянии продолжать работу с примерами библиотеки Qt, которые будут обсуждаться в следующей главе.

Next Previous Table of Contents