<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook V3.1-Based Variant V1.0//EN" [
 <!ENTITY kdevelop "<application>kdevelop</application>">
 <!ENTITY % addindex "IGNORE">
 <![ %addindex; [ <!ENTITY docindex SYSTEM "docindex.docbook"> ]]>
]>
<book lang="ru">
<bookinfo>
<title>Учебники по cозданию приложений для KDE
</title>
<subtitle>Учебники по созданию приложений для KDE в Интегрированной Среде Разработки KDevelop </subtitle>
<authorgroup>
<author>
<surname>Ralf Nolden </surname>
<affiliation>
	  <orgname>Команда разработчиков KDevelop</orgname>
<address><email><ulink url="mailto:Ralf.Nolden@post.rwth-aachen.de">&lt;Ralf.Nolden@post.rwth-aachen.de&gt;</ulink></email></address>
</affiliation>
</author>
</authorgroup>
<date>Версия 0.1 , Понедельник, 21 июня 1999</date>
<releaseinfo><!-- information about this particular version --></releaseinfo>
<abstract>
<para>Учебники по созданию приложений для KDE в Интегрированной Среде Разработки KDevelop - это набор учебников, описывающих как создавать приложения для KDE
на примерах и как собрать эти приложения и примеры, включая использование
библиотеки Qt. Это руководство является частью Интегрированной Среды Разработки KDevelop и поэтому также распространяется в соответствии с GNU General Public License; см. <link linkend="Copyright">Copyright</link> для дополнительной
информации.</para>
<para>KDE</para><!-- Merge this with the previous paragraph; it comes from <META NAME="description" CONTENT="..."> --></abstract>

</bookinfo>

<chapter id="vvedenie">
<title>Введение</title>

<para>Т.к. в настоящее время KDE cтановится стандартом десктопа UNIX систем,
все больше и больше программистов хотят использовать преймущества хорошо
написанного API, которое предоставляет проект KDE для создания новых
графических приложений, а также легкие в использовании классы, поставляемые
с Qt/KDE. Задачей проекта KDevelop является предоставление IDE, которая
позволит программистам быстро создавать и развивать свои приложения,
направленные на работу в KDE. Так как у начинающих всегда возникают проблемы
с началом работы, это руководство постарается объяснить некоторые аспекты
создания приложений для KDE, описывая создание работающего приложения из
примеров программ, поставляемых вместе с библиотекой Qt, с использованием
IDE KDevelop, а также создание KDE приложения на примерах.</para>

<para>Поэтому следующая глава объяснит вам, как создать проект с помощью KDevelop,
который уже является законченным приложением; далее мы перейдем к документации
по библиотеке Qt, которая содержит исходные тексты примеров использования
библиотеки Qt.</para>

<para>Это даст вам начальные знания о функциях библиотеки Qt и о том, как 
использовать классы, поставляемые с этой библиотекой; библиотека Qt
является отправной точкой потому, что KDE - это надстройка над Qt и
приложения KDE широко используют эту библиотеку.</para>

<para>Далее мы рассмотрим процесс создания мини-приложения KDE с помощью Мастера
Приложений KDevelop. На минимальной основе мы созданим работающий пример
приложения KDE, использующего библиотеки KDE, и рассмотрим различные части
KDE приложения более подробно.</para>

<para>Команда разработчиков KDevelop желает вам успехов в изучении KDE и Qt с
помощью этого руководства и надеется, что она поможет вам стать еще одним
программистом, разрабатывающим свои программы для проекта KDE.</para>

<sect1 id="chto-vy-uzhe-dolzhny-znat">
<title>Что вы уже должны знать</title>

<para>Для успешного понимания примеров исходных текстов и их функциональности
необходимо наличие базовых знаний языка программирования C++. В дальнейшем 
будет подразумеваться, что вы прочли <ulink url="../index.html">Руководство пользователя KDevelop</ulink>, так же как и <ulink url="../programming/index.html">Руководство по программированию в  KDevelop</ulink>, и знаете, как IDE KDevelop устроена и что собой представляют
созданные ею проекты.</para>
</sect1>
</chapter>

<chapter id="nachalo-raboty-getting-started">
<title>Начало работы (Getting Started)</title>

<para>Для начала работы вы должны правильно настроить KDevelop. Убедитесь, что
вы имеете доступ к документации по библиотеке Qt через меню "Помощь" или
соответствующую книгу в дереве документации. Если вы посмотрите на первую
страницу документации по Qt, то вы увидите, что она содержит ссылки на
разделы "Учебник" и "Примеры". В разделе "Учебник" вы найдете введение в
использование библиотеки Qt для создания приложений из 14 шагов. С другой
стороны, раздел "Примеры" приведет вас к набору примеров приложений,
входящих в поставку Qt и используемых в качестве иллюстрации функционирования
некоторых классов. Теперь, если вы абсолютный новичок, вам должна понравиться
идея библиотеки Qt - бибилотеки, предоставляющей:</para>

<para><itemizedlist>
<listitem>
<para>базовый класс приложения (<literal remap="tt">QApplication</literal>)</para>
</listitem>
<listitem>
<para>библиотеку визуальных элементов для графического интерфейса пользователя</para>
</listitem>
<listitem>
<para>набор вспомогательных классов для обработки графики, файлов и пр.данных</para>
</listitem>
<listitem>
<para>механизм сигнал-слот, необходимый для сообщения объектов</para>
</listitem>
<listitem>
<para>контролирование событий с помощью циклов событий и виртуальных методов</para>
</listitem>
</itemizedlist>
</para>

<para>Если это вам ни о чем не говорит, вы должны прочитать о библиотеке Qt в
<ulink url="../programming/index-2.html#ss2.1">Руководство по  программированию в KDevelop</ulink>, где детально описаны основы приложений Qt.
Там же вы найдете введение в различия между Qt и KDE приложениями, которое
не очень велико на первых шагах учебника по Qt.</para>

<para>Изучение документации по Qt является хорошей предпосылкой для разработки
приложений KDE, поэтому мы создадим проект, из которого после редактирования
получим учебный пример приложения.</para>

<para>Для этого запустите KDevelop и выберите пунтк меню "Проект-&gt;Новый".
Появится мастер приложений и вам нужно будет указать тип приложения,
который вы хотите создать. Для приложения Qt нужно выбрать пункт
"Приложение Qt", но мы будем использовать мини-приложения KDE в наших
примерах. Причина проста: учебник по Qt содержит не очень много исходных
текстов, поэтому нам придется вносить множество изменений, чтобы
создать "настоящий" пример приложения.</para>

<para>Т.к. мини-приложение KDE состоит только из пустого главного окна, но
заодно проверяет наличие библиотеки Qt и файлов заголовков, оно
подойдет для наших целей без каких-либо существенных изменений.</para>

<para>На следующей страничке мастера приложений необходимо указать специфичную
для данного проекта информацию. Здесь мы оставим в покое всякие специфичные
для KDE атрибуты такие, как основная иконка и мини-иконка, документация и 
т.д. Мы только заполним информацию, необходимую для создания и сборки 
учебных примеров. Т.к. последующий учебный пример основан на исходных текстах
предыдущего, мы можем назвать наш проект <literal remap="tt">MyWidget</literal>. Так же будет 
называться базовый класс, который потребуется нам в главе 4, поэтому нам
не надо будет думать об этом позже. Т.к. мы начнем с самого первого
учедного примера, укажем '1' в качестве номера версии проекта, далее будем
этот номер увеличивать по мере перехода к следующим примерам.</para>

<para>Далее введите остальную необходимую информацию, такую как ваше имя,
адрес электронной почты и директорию проекта. Это все что нам потребуется 
и теперь мы сможем перейти на следующую страницу. Вставьте вашу шапку для
файлов-заголовков проекта или используйте приведенный пример. Так же 
поступите и на странице 4, где указывается шапка для файлов исходных 
текстов. Наконец, на последней странице вам осталось только лишь нажать
кнопку "Создать" для создания вашего проекта. Если кнопка оказалась 
недоступна, повторите весь процесс начиная с первой страницы и убедитесь,
что вы заполнили всю необходимую информацию.</para>

<para>Если все прошло хорошо, проект будет создан и на последней строчке в окне
сообщений мастера приложений появится надпись "READY". Нажмите кнопку
"Закрыть" чтобы закрыть окно мастера приложений.</para>

<para>Если вы посмотрите на окно представления деревьями слева, то увидите, что
ваш проект уже включает в себя класс с имененм "MyWidget" - это все
потому, что мы указали его в качестве имени проекта. Далее, когда вы
развернете подветку "Функции" в ветке "Глобальное" просмотрщика классов,
вы увидите, что приложение уже содержит функцию <literal remap="tt">main()</literal>, с которой и
начинается исполнение программы. </para>

<para>Теперь приложение готово к сборке и запуску. Вы можете выбрать пункты меню
"Выполнить" или "Собрать", но т.к. мы хотели создать учебное приложение, то 
мы сначала внесем изменения в исходный текст для создания учебного примера,
который мы будем использовать и на последующих шагах.</para>
</chapter>

<chapter id="sborka-primerov-qt">
<title>Сборка примеров Qt</title>

<sect1 id="shag-pervyi-hello-world">
<title>Шаг первый: Hello World!</title>

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

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

<sect2 id="chto-izmeniat-pervym">
<title>Что изменять первым</title>

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

<sect2 id="vvod-iskhodnogo-teksta-primera">
<title>Ввод исходного текста примера</title>

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

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

<para>Наконец, вставьте следующие файлы заголовков перед функцией <literal remap="tt">main()</literal>:</para>

<para><screen>#include &lt;qapplication.h&gt;
#include &lt;qpushbutton.h&gt;
</screen>
</para>

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

<sect2 id="sborka-hello-world">
<title>Сборка Hello World!</title>

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

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

<sect2 id="uprazhneniia">
<title>Упражнения</title>

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

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

<para><orderedlist><listitem>
<para>замените pushbutton на QLabel.</para>
</listitem>
<listitem>
<para>используйте <literal remap="tt">setText()</literal> вместо непосредственного указания текста в конструкторе pushbutton.</para>
</listitem>
<listitem>
<para>используйте <literal remap="tt">QPushButton::resize ( const QSize & s )</literal> вместо установки размеров с помощью непосредственного указания ширины и высоты. Сначала создатейте объект класса <literal remap="tt">QSize</literal>, содержащий эти размеры.</para>
</listitem>
<listitem>
<para>поизменяйте размеры, чтобы разобраться какой параметр высота, а какой ширина.</para>
</listitem>
</orderedlist>
</para>
</sect2>
</sect1>

<sect1 id="shagi-2-i-3-rasshireniia">
<title>Шаги 2 и 3: Расширения</title>

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

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

<para>Также необходимо обратить внимание на то, что кнопка, которая вызывает уничтожение
объекта <literal remap="tt">QApplication</literal>, вызывает функцию <literal remap="tt">quit()</literal>. Далее мы встретимся
с функцией <literal remap="tt">quit()</literal>, когда будем работать с аналогом <literal remap="tt">QApplication</literal> в
KDE - <literal remap="tt">KApplication</literal>.</para>
</sect1>

<sect1 id="sozdanie-vashikh-sobstvennykh-vizualnykh-ele">
<title>Создание ваших собственных визуальных элементов</title>

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

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

<para>Здесь вам надо будет проследить за подключением файла заголовков <literal remap="tt">qfont.h</literal>,
<literal remap="tt">QFont</literal> используется только в конструкторе класса <literal remap="tt">MyWidget</literal>. Поэтому
добавьте строку <literal remap="tt">&&num;;include &&lt;;qfont.h&&gt;;</literal> в начало файла <literal remap="tt">mywidget.cpp</literal>.</para>

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

<sect1 id="rasshirenie-klassa-widget">
<title>Расширение класса Widget</title>

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

<para><itemizedlist>
<listitem>
<para>QEvent</para>
</listitem>
<listitem>
<para>QChildEvent</para>
</listitem>
<listitem>
<para>QCloseEvent</para>
</listitem>
<listitem>
<para>QFocusEvent</para>
</listitem>
<listitem>
<para>QKeyEvent</para>
</listitem>
<listitem>
<para>QMouseEvent</para>
</listitem>
<listitem>
<para>QMoveEvent</para>
</listitem>
<listitem>
<para>QPaintEvent</para>
</listitem>
<listitem>
<para>QResizeEvent</para>
</listitem>
<listitem>
<para>QTimerEvent</para>
</listitem>
</itemizedlist>
</para>

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

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

<para>Теперь вы сможете обрабатывать параметры события. Для <literal remap="tt">QMouseEvent</literal>
вам надо будет выяснить какая из кнопок, правая, средняя или левая,
породила событие.</para>
</sect1>

<sect1 id="dobavlenie-novogo-klassa">
<title>Добавление нового класса</title>

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

<para>Для того, чтобы добавить класс с помощью Создателя Классов, выберите пункт
"Новый Класс" в меню "Проекты", в результате появится диалоговое окно, поля
которого надо будет заполнить необходимыми значениями. Сначала введем имя класса.
В учебнике фигурирует имя <literal remap="tt">LCDRange</literal>. Затем укажем базовый класс.
Свойства нового класса будут унаследованы от базового класса. В учебнике
(по Qt 1.42) таковым является <literal remap="tt">QWidget</literal>. Т.к. большинство добавляемых
классов наследуются от QWidget, то мы можем не заполнять это поле, а просто
пометить кнопочку "потомок класса QWidget" в секции "Дополнительные
параметры". Это приведет к автоматическому добавлению макроса <literal remap="tt">Q&&lowbar;;OBJECT</literal>
в файл определения для добавления слотов и сигналов в дальнейшем (это
понадобиться в главе 7).</para>

<para>Т.к. имена файлов подставляются автоматически, вам не нужно об этом
беспокоиться. Единственное, что мы можем посоветовать добавить - это
документация. Всегда считалось хорошим стилем прилагать подробное
описание к классу, особенно когда, например, имя класса <literal remap="tt">LCDRange</literal>
не наводит на мысли о его предназначении.</para>
</sect1>

<sect1 id="shagi-7-14">
<title>Шаги 7-14</title>

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

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

<chapter id="copyright">
<title>Copyright </title>

<para><screen>
KDevelop Copyright 1998,1999 Команда разработчиков KDevelop.

Эта программа является свободным программным обеспечением; вы можете
распространять и/или изменять ее в соответствии с терминами и определениями
GNU General Public License версии 2 или (по вашему выбору) более поздних,
опубликованной Free Software Foundation.

Эта программа распространяется с надеждой на то, что она будет полезной,
но АБСОЛЮТНО БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии (implied warranty of)
MERCHANTABILITY или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ. Для справки см.
GNU General Public License.

Вы должны были получить копию GNU General Public License с этой программой;
если это не так, запросите ее по адресу Free Software Foundation, Inc.,
675 Mass Ave, Cambridge, MA 02139, USA.

</screen>
</para>
</chapter>
<![ %addindex; [ &docindex; ]]>
</book>
<!--
Local Variables:
mode: sgml
sgml-omittag: nil
sgml-shorttag: t
sgml-general-insert-case: lower
End:
-->
