https://techbase.kde.org/api.php?action=feedcontributions&user=Kradio5&feedformat=atomKDE TechBase - User contributions [en]2024-03-28T12:27:00ZUser contributionsMediaWiki 1.40.2https://techbase.kde.org/index.php?title=Development/Tutorials/Using_KActions_(ru)&diff=50057Development/Tutorials/Using KActions (ru)2010-03-12T13:01:59Z<p>Kradio5: </p>
<hr />
<div>{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}<br />
<br />
{{TutorialBrowser|<br />
<br />
series=Beginner Tutorial|<br />
<br />
name=Использование KActions и XMLGUI|<br />
<br />
pre=[[Development/Tutorials/Using_KXmlGuiWindow_(ru)|Урок 2 - KXmlGuiWindow]], Basic XML knowledge|<br />
<br />
next=[[Development/Tutorials/Saving_and_loading|Tutorial 4 - Saving and loading]]|<br />
<br />
reading=None<br />
}}<br />
<br />
==Введение==<br />
В данном уроке представлена базовая информация по работе с элементами actions (действиями). Действия -- центральная концепция при реализации интерактивности программы.<br />
<br />
Например, если нужно, чтобы пользователь приложения [[Development/Tutorials/Using_KXmlGuiWindow| с урока 2 ]] мог очищать текстовое поле нажатием кнопки на панели инстрментов, комбинацией клавиш или выбрав некоторый пункт меню, то всё это можно реализовать с помощью одного класса {{class|KAction}}.<br />
<br />
[[image:introtokdetutorial3.png|frame|center]]<br />
<br />
==KAction==<br />
Объект класса {{class|KAction}} хранит информацию о значке и клавише быстрого вызова, связанных с определённым действием. Действие может быть соединено со [http://doc.trolltech.com/latest/signalsandslots.html слотом], обрабатывающем его.<br />
<br />
== Листинг кода ==<br />
<br />
===main.cpp===<br />
<code cppqt n><br />
#include <KApplication><br />
#include <KAboutData><br />
#include <KCmdLineArgs><br />
<br />
#include "mainwindow.h"<br />
<br />
int main (int argc, char *argv[])<br />
{<br />
KAboutData aboutData( "tutorial3", "tutorial3",<br />
ki18n("Tutorial 3"), "1.0",<br />
ki18n("A simple text area using KAction etc."),<br />
KAboutData::License_GPL,<br />
ki18n("Copyright (c) 2007 Developer") );<br />
KCmdLineArgs::init( argc, argv, &aboutData );<br />
KApplication app;<br />
<br />
MainWindow* window = new MainWindow();<br />
window->show();<br />
return app.exec();<br />
}<br />
</code><br />
Небольшие изменения конструктора KAboutData файла <tt>main.cpp</tt>. Теперь он будет показывать, что приложение принадлежит уроку 3.<br />
<br />
===mainwindow.h===<br />
<code cppqt n><br />
#ifndef MAINWINDOW_H<br />
#define MAINWINDOW_H<br />
<br />
#include <KXmlGuiWindow><br />
#include <KTextEdit><br />
<br />
class MainWindow : public KXmlGuiWindow<br />
{<br />
public:<br />
MainWindow(QWidget *parent=0);<br />
<br />
private:<br />
KTextEdit* textArea;<br />
void setupActions();<br />
};<br />
<br />
#endif<br />
</code><br />
Добавьте вызов функции <tt>void setupActions()</tt>, которая будет выполнять настройку KActions.<br />
<br />
===mainwindow.cpp===<br />
<code cppqt n><br />
#include "mainwindow.h"<br />
<br />
#include <KApplication><br />
#include <KAction><br />
#include <KLocale><br />
#include <KActionCollection><br />
#include <KStandardAction><br />
<br />
MainWindow::MainWindow(QWidget *parent)<br />
: KXmlGuiWindow(parent)<br />
{<br />
textArea = new KTextEdit;<br />
setCentralWidget(textArea);<br />
<br />
setupActions();<br />
}<br />
<br />
void MainWindow::setupActions()<br />
{<br />
KAction* clearAction = new KAction(this);<br />
clearAction->setText(i18n("Clear"));<br />
clearAction->setIcon(KIcon("document-new"));<br />
clearAction->setShortcut(Qt::CTRL + Qt::Key_W);<br />
actionCollection()->addAction("clear", clearAction);<br />
connect(clearAction, SIGNAL(triggered(bool)),<br />
textArea, SLOT(clear()));<br />
<br />
KStandardAction::quit(kapp, SLOT(quit()),<br />
actionCollection());<br />
<br />
setupGUI();<br />
}<br />
</code><br />
<br />
<br />
==Объяснение==<br />
Приложение основано на исходном коде, приведённом в [[Development/Tutorials/Using_KXmlGuiWindow_(ru)|Уроке 2]]. Большинство изменений касаются <tt>mainwindow.cpp</tt>. Конструктор MainWindow теперь вместо <tt>setupGUI()</tt> вызывает <tt>setupActions()</tt>. KAction создаётся и настраивается в функции <tt>setupActions()</tt> до вызова <tt>setupGUI()</tt>.<br />
<br />
<br />
<br />
Для создания действия в <tt>.cpp</tt> необходимо наличие <tt>#include <KAction></tt><br />
=====Создание объекта KAction=====<br />
Мы создадим действие, которое очищающает текстовое поле [[Development/Tutorials/Using_KXmlGuiWindow_(ru)|(см. Урок 2)]]. KAction создаётся в несколько шагов. Первый - включение заголовочного файла и создание объекта KAction:<br />
<code cppqt><br />
#include <KAction><br />
...<br />
KAction* clearAction = new KAction(this);<br />
</code><br />
Этот код создаёт действие <tt>clearAction</tt>.<br />
<br />
===Настройка свойств KAction===<br />
<br />
=====Текст=====<br />
Теперь, когда объект KAction создан, можно приступить к его настройке. Сначала, мы задаём текст, отображаемый в меню и под значком <tt>KAction</tt> на панели инструментов.<br />
<code cppqt>clearAction->setText(i18n("Clear"));</code><br />
Если планируется перевод интерфейса, то следует использовать функцию i18n для обработки текста (более подробную информацию можно получить в [[Development/Tutorials/Localization/i18n|уроке по i18n]]<br />
<br />
<br />
=====Значок=====<br />
В случае отображения действия на панели неплохо использовать значок, характеризующий это действие. Следующий код с помощью функции <tt>setIcon()</tt> устанавливает стандартный значок KDE <tt>document-new</tt><br />
<code cppqt>clearAction->setIcon(KIcon("document-new"));</code><br />
<br />
=====Комбинация клавиш=====<br />
Связать комбинацию клавиш с нашим действием совершенно просто:<br />
<code cppqt>clearAction->setShortcut(Qt::CTRL + Qt::Key_W);</code><br />
Данный фрагмент кода связывает с нашим действием комбинацию клавиш Ctrl+W:<br />
<br />
<br />
=====Добавдение в набор (Collection)=====<br />
<br />
Чтобы сделать наше действие доступным системе XMLGUI (более подробное объяснение приведено дальше), следует добавить его в ''набор действий (action collection)'' приложения c помощью <tt>actionCollection()</tt> следующим образом:<br />
<code cppqt><br />
actionCollection()->addAction("clear", clearAction);<br />
</code><br />
В данном примере мы добавляем <tt>clearAction</tt> в коллекцию, задав имя ''clear''. Это имя используется системой XMLGUI.<br />
<br />
<br />
=====Соединение действия с обработчиком=====<br />
<br />
Теперь, когда параметры внешнего вида действия определены, можно связать его с методом tt>clear()</tt> объекта KTextArea.<br />
<code cppqt><br />
connect( clearAction, SIGNAL( triggered(bool) ), <br />
textArea, SLOT( clear() ) );<br />
</code><br />
Интерфейс класса аналогичен {{qt|QAction}}, в KAction лишь добавлены специфические для KDE особенности.<br />
<br />
===KStandardAction===<br />
<br />
Для часто используемых в KDE приложениях действий, таких, как quit, save, и load, доступны готовые объекты KAction, доступные через класс {{class|KStandardAction}}.<br />
<br />
Их очень легко использовать. После включения заголовочного файла <tt><KStandardAction></tt> в ваш код, следует просто соединить их с функциями-обработчиками и добавить в соответствующую коллекцию (KActionCollection). Например, следующий код<br />
<br />
<code cppqt>KStandardAction::quit(kapp, SLOT(quit()), actionCollection());</code><br />
создаст действие с соответствующим значком, текстом, клавишей быстрого вызова и даже добавит пункт в меню File.<br />
<br />
<br />
==Добавление действия в меню и на панель управления==<br />
<br />
На данном этапе действие "Clear" только создано: оно не будет отображено в меню или на панели управления. Чтобы задать, куда следует добавить действия (и позволить пользователю программы перемещать их), следует использовать KDE-технологию XMLGUI. <br />
<br />
{{note|В последующих версиях KDE4, XMLGUI может быть заменена на систему liveui. Но сейчас XMLGUI является единственным правильным способом настройки UI.}}<br />
<br />
<br />
===XMLGUI===<br />
<br />
При вызове функции <tt>setupGUI()</tt> в нашем классе (производном) {{class|KXmlGuiWindow}}, осуществляется обращение к системе XmlGui, которая читатет XML файл с описанием интерфейса (мы рассмотрим его позже) и создаёт кнопки и меню.<br />
<br />
Очевидно, что XmlGui требуется знать, какой файл является файлом описания, т.е. его имя и расположение. По установленному правилу имя файла должно быть <tt>appnameui.rc</tt> (где <tt>appname</tt> является именем, заданным в {{class|KAboutData}}), таким образом, в нашем примере файл должен быть назван <tt>tutorial3ui.rc</tt>. Его расположение определяется CMake.<br />
<br />
===Создание файла ''appname''ui.rc ===<br />
<br />
В связи с тем, что UI описывается на языке XML, порядок описания должен придерживаться строгих правил. В данном уроке мы не станем подробно рассказывать обо всех правилах, но для получения большей информации рекомендуется посмотреть страницу _с_подробным_описанием_XML (когда у нас будет статья с полным описанием XmlGui (или, возможно, liveui, если эта система будет реализована :)) здесь будет соответсвующая ссылка).<br />
<br />
<br />
===tutorial3ui.rc===<br />
<code xml n><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<gui name="tutorial3"<br />
version="1"<br />
xmlns="http://www.kde.org/standards/kxmlgui/1.0"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0<br />
http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" ><br />
<br />
<MenuBar><br />
<Menu name="file" ><br />
<text>&amp;File</text><br />
<Action name="clear" /><br />
</Menu><br />
</MenuBar><br />
<br />
<ToolBar name="mainToolBar" ><br />
<text>Main Toolbar</text><br />
<Action name="clear" /><br />
<ActionList name="dynamicActionlist" /><br />
</ToolBar><br />
<br />
</gui><br />
</code><br />
<br />
Тэг <tt><Toolbar></tt> служит для описания панели инструментов (toolbar). Панель инструментов - это панель со значками, находящаяся в верхней части окна. В данном примере она получила уникальное имя ''mainToolBar'' и с помощью <tt><text></tt> видимое пользователю имя ''Main Toolbar'', также мы добавляем на панель наше действие, используя тэг <tt><Action></tt>. Значение, заданное в параметре name, должно быть идентичным строке, переданной функции <tt>addAction()</tt> в нашем С++ коде.<br />
<br />
Теперь можно добавить действие в меню. Для этого мы используем тэг <tt><MenuBar></tt>, в остальном всё абсолютно идентично выше описаному.<br />
Заметьте, что таким же способом можно динамически добавлять список действий, используя тэг <tt><ActionList></tt>. Для получения более подробной информации обратитесь к документации по методу <tt>plugActionList()</tt> класса {{class|KXMLGUIClient}}. <br />
<br />
При изменении .rc файла следует изменять атрибут 'version', чтобы обновить кэш.<br />
<br />
==CMake==<br />
Из-за того, что был использован XmlGui, необходимо копировать <tt>tutorial3ui.rc</tt> туда, где KDE сможет его найти. '''Это означает, что необходимо куда-нибудь установить наш проект.'''<br />
<br />
===CMakeLists.txt===<br />
<code><br />
project(tutorial3)<br />
<br />
find_package(KDE4 REQUIRED)<br />
include_directories( ${KDE4_INCLUDES} )<br />
<br />
set(tutorial3_SRCS <br />
main.cpp<br />
mainwindow.cpp<br />
)<br />
<br />
kde4_add_executable(tutorial3 ${tutorial3_SRCS})<br />
<br />
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})<br />
<br />
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})<br />
install( FILES tutorial3ui.rc <br />
DESTINATION ${DATA_INSTALL_DIR}/tutorial3 )<br />
</code><br />
<br />
Данный файл почти идентичен файлу со второго урока, но имеет две дополнительные строки. Они как раз и описывают, куда должны быть установлены файлы. Сначала в <tt>BIN_INSTALL_DIR</tt> будет установлен <tt>tutorial3</tt> (бинарный файл, target), затем в каталог приложения (data directory) - файл <tt>tutorial3ui.rc</tt>, описывающий пользовательский интерфейс.<br />
<br />
===Сборка, установка и запуск===<br />
Если у вас нет доступа к каталогу KDE4, то приложение можно установить в папку домашнего каталога. <br />
<br />
Чтобы указать CMake, куда следует установить программу, нужно использовать переменную <tt>DCMAKE_INSTALL_PREFIX</tt>. Таким образом, чтобы установить программу в каталог KDE, выполните:<br />
<br />
cmake . -DCMAKE_INSTALL_PREFIX=$KDEDIR<br />
make install<br />
tutorial3<br />
<br />
Однако, если вы хотите установить программу куда-либо, чтобы проверить её (было бы глупо устанавливать приложения с этих уроков в каталог KDE), следует напечатать:<br />
cmake . -DCMAKE_INSTALL_PREFIX=/home/kde-devel/kdetmp<br />
это создаст KDE-подобную структуру каталогов в ~/kdetmp и установит исполняемый файл в <br />
{{path|/home/kde-devel/kdetmp/bin/tutorial3}}.<br />
<br />
==Продолжим изучение==<br />
TODO<br />
<br />
[[Category:C++]]</div>Kradio5https://techbase.kde.org/index.php?title=Development/Tutorials/First_program_(ru)&diff=50056Development/Tutorials/First program (ru)2010-03-12T12:48:46Z<p>Kradio5: grammatical mistake is fixed</p>
<hr />
<div>{{Template:I18n/Language Navigation Bar|Development/Tutorials/First_program}}<br />
{{TutorialBrowser|<br />
<br />
series=Beginner Tutorial|<br />
<br />
name=Hello World|<br />
<br />
pre=[http://mindview.net/Books/TICPP/ThinkingInCPP2e.html C++], [http://www.trolltech.com/products/qt/ Qt], [[Getting_Started/Build/KDE4_(ru)|Сборка и настройка KDE4]]|<br />
<br />
next=[[Development/Tutorials/Using_KXmlGuiWindow_%28ru%29|Урок 2 - KXmlGuiWindow]]| <br />
<br />
reading=[[Development/Tutorials/CMake|CMake]]<br />
}}<br />
<br />
==Введение==<br />
Первая программа приветствует мир дружелюбным "Hello World". Для этого будет использован {{class|KMessageBox}} с изменением одной из кнопок.<br />
[[image:introtokdetutorial1.png|frame|center]]<br />
<br />
{{tip|Для получения большей информации о каком-либо классе, с которым вы работаете, Konqueror предоставляет возможность быстрого вызова справки. Таким образом, чтобы посмотреть информацию о KMessageBox, просто введите "kde:kmessagebox" в Konqueror, и будет открыта документация.}}<br />
<br />
{{tip|<br />
Для работы с проектами можно использовать KDevelop, имеющий такие функции, как дополнение кода, лёгкий доступ к документации по API или поддержка отладки, удобство которых вы обязательно оцените после получения минимального опыта программирования.<br />
<br />
В [[Getting_Started/Set_up_KDE_4_for_development_(ru)#KDevelop|этом документе]] описывается настройка KDevelop для данной задачи. Проверить, работают ли настройки, можно попробовав открыть проект существующего приложения KDE4 с помощью KDevelop.<br />
<br />
Тем не менее, файлы CMake по-прежнему нужно редактировать вручную.<br />
}}<br />
<br />
==Код==<br />
Весь необходимый код находится в <tt>main.cpp</tt>. Создайте файл с кодом, приведённым ниже:<br />
<code cppqt><br />
#include <QString><br />
#include <KApplication><br />
#include <KAboutData><br />
#include <KMessageBox><br />
#include <KCmdLineArgs><br />
#include <KLocalizedString><br />
<br />
int main (int argc, char *argv[])<br />
{<br />
KAboutData aboutData("tutorial1", // Имя программы используется для внутренних нужд.<br />
0, // Имя директории с сообщением (The message catalog name), используется имя программы, если 0.<br />
ki18n("Tutorial 1"), // Отображаемое имя программы.<br />
"1.0", // Строка с информацией о версии программы.<br />
ki18n("KMessageBox popup"), // Краткое описание того, что делает программа.<br />
KAboutData::License_GPL, // Тип лицензии.<br />
ki18n("(c) 2007"), // Заявление об авторском праве.<br />
ki18n("Some text..."), // Произвольный текст, содержащий информацию любого рода.<br />
"http://tutorial.com", // Адрес домашней страницы программы<br />
"submit@bugs.kde.org"); // Строка с адресом электронной почты для сообщений об ошибках.<br />
<br />
KCmdLineArgs::init( argc, argv, &aboutData );<br />
KApplication app;<br />
KGuiItem guiItem( QString( "Hello" ), QString(),<br />
QString( "this is a tooltip" ),<br />
QString( "this is a whatsthis" ) );<br />
KMessageBox::questionYesNo( 0, "Hello World", "Hello", guiItem );<br />
}<br />
</code><br />
<br />
Первый KDE код, который был встречен в программе - {{class|KAboutData}}. Это специальный класс для хранения такой информации о программе, как краткое описание, авторы, тип лицензии. Почти каждое (Pretty much) KDE-приложение должно использовать этот класс.<br />
<br />
Затем был использован {{class|KCmdLineArgs}}. Этот класс позволяет задать параметры командной строки, например, чтобы запускать программу с заданным файлом. Однако, в этом туториале мы просто инициализировали этот класс с помощью созданного объекта {{class|KAboutData}}. Так что можно использовать параметры командной строки <tt>--version</tt> or <tt>--author</tt>.<br />
<br />
В строке 13 был создан объект {{class|KApplication}}. Он нужен для таких вещей, как [[Development/Tutorials/Localization/i18n|поддержка перевода программ на другие языки]].<br />
<br />
Теперь, когда все требуемые начальные действия относящиеся к KDE выполнены, можно перейти к созданию интересных вещей для нашего приложения. Мы собираемся сделать всплывающее окно (popup box), кроме того, мы изменим одну из кнопок. Чтобы это сделать, нужен объект {{class|KGuiItem}}. Первый аргумент в конструкторе {{class|KGuiItem}} - текст, который отображается на элементе (в нашем случае - кнопке). Следующий параметр - значок для кнопки, но нам это не нужно, поэтому мы опускаем его, написав <tt>QString()</tt>. Наконец, мы задаём текст всплывающей подсказки (который появляется при наведении курсора на элемент) и текст для "What's This(Что это такое)?" (доступно через правый щелчок мышью или же Shift-F1)<br />
<br />
Теперь элемент настроен, и мы можем создать всплывающее окно (popup). Для этого вызывается функция <tt>KMessageBox::questionYesNo()</tt>, которая по умолчанию создаёт MessageBox с кнопками "Да", "Нет". Второй аргумент - текст, который будет выведен посередине диалогового окна.<br />
Третий - заголовок, который будет задан для окна и, наконец, мы используем KGuiItem (что будет нормально работать) для кнопки "Да" в <tt>KGuiItem guiItem</tt>, который нами создан.<br />
<br />
Теперь, когда мы закончили ознакомление с кодом, время собрать и запустить наше приложение.<br />
<br />
==Сборка==<br />
Если системное окружение было настроено так, как описано в [[Getting Started/Build/KDE4_(ru)]], то код можно скомпилировать так:<br />
<br />
g++ main.cpp -o tutorial1 \<br />
-I$QTDIR/include/Qt \<br />
-I$QTDIR/include/QtCore \<br />
-I$QTDIR/include \<br />
-I$KDEDIR/include/KDE \<br />
-I$KDEDIR/include \<br />
-L$KDEDIR/lib \<br />
-L$QTDIR/lib -lQtCore -lQtGui -lkdeui -lkdecore<br />
А затем запустить с помощью <br />
dbus-launch ./tutorial1<br />
<br />
===Использование CMake===<br />
Процесс сборки автоматизируется с помощью [[Development/Tutorials/CMake|CMake]]. Он самостоятельно определяет расположение библиотек и заголовочных файлов KDE, Qt и др. Использование CMake упрощает сборку приложения на другом компьютере.<br />
<br />
====CMakeLists.txt====<br />
Создайте файл с именем CMakeLists.txt со следующим содержанием в той же директории, что и main.cpp <br />
<code><br />
project (tutorial1)<br />
<br />
find_package(KDE4 REQUIRED)<br />
include_directories( ${KDE4_INCLUDES} )<br />
<br />
set(tutorial1_SRCS main.cpp)<br />
<br />
kde4_add_executable(tutorial1 ${tutorial1_SRCS})<br />
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})<br />
</code><br />
<br />
Функция <tt>find_package()</tt> находит заданный пакет (в данном случае KDE4) и устанавливает определённые переменные, описывающие расположение заголовков и библиотек пакета. В данном примере использована переменная <tt>KDE4_INCLUDES</tt>, которая содержит путь к заголовочным файлам KDE4.<br />
<br />
Чтобы компилятор нашёл эти файлы, нужно передать эту переменную функции <tt>include_directories()</tt>, которая добавит директорию с заголовками KDE4 в поиск (search path).<br />
<br />
Далее была создана переменная <tt>tutorial1_SRCS</tt>, инициализированная с помощью функции <tt>set()</tt>. В данном случае, ей было просто задано имя исходного файла.<br />
<br />
Затем была использована функция <tt>kde4_add_executable()</tt>, чтобы создать исполняемый файл <tt>tutorial1</tt> из исходных файлов, перечисленных в переменной <tt>tutorial1_SRCS</tt>. Наконец, указывается библиотека KDE4 kdeui для линковки с файлом с помощью <tt>target_link_libraries()</tt> и переменной <tt>KDE4_KDEUI_LIBS</tt>, заданной с помощью функции <tt>find_package()</tt>.<br />
<br />
====Выполнение сборки и запуск (Make and Run)====<br />
Опять же, если системное окружение было установлено так, как описано в [[Getting Started/Build/KDE4]], данный исходный код можно скомпилировать с помощью<br />
cmakekde<br />
<br />
Если нет, то:<br />
<br />
mkdir build<br />
cmake .. && make<br />
<br />
И запустить<br />
./tutorial1.shell<br />
<br />
==Продолжим изучение==<br />
Теперь можно перейти к [[Development/Tutorials/Using_KXmlGuiWindow_(ru)|статье о KXmlGuiWindow]].<br />
<br />
[[Category:C++]]</div>Kradio5https://techbase.kde.org/index.php?title=Development/Tutorials/Using_KXmlGuiWindow_(ru)&diff=50055Development/Tutorials/Using KXmlGuiWindow (ru)2010-03-12T12:46:42Z<p>Kradio5: some grammatical mistakes are fixed</p>
<hr />
<div>{{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KXmlGuiWindow}}<br />
{{TutorialBrowser|<br />
<br />
series=Beginner Tutorial|<br />
<br />
name=Использование KXmlGuiWindow|<br />
<br />
pre=[[Development/Tutorials/First_program_(ru)|Урок 1 - Hello World]]|<br />
<br />
next=[[Development/Tutorials/Using_KActions_(ru)|Урок 3 - KAction и XmlGui]]| <br />
<br />
reading={{class|KXmlGuiWindow}}<br />
}}<br />
<br />
==Введение==<br />
Это продолжение [[Development/Tutorials/First_program|урока по созданию первой программы]], здесь представлена базовая информация по классу {{class|KXmlGuiWindow}}.<br />
<br />
В предыдущем уроке рассказывалось как создать всплывающее диалоговое окно, теперь мы сделаем первые шаги по созданию полноценного функционального приложения.<br />
<br />
[[image:introtokdetutorial2.png|frame|center]]<br />
<br />
==Использование KXmlGuiWindow==<br />
<br />
Чтобы получить пользу от KXmlGuiWindow, следует создать производный от него класс. Наш код находится в двух файлах: <tt>mainwindow.cpp</tt> и <tt>mainwindow.h</tt>. Класс KXmlGuiWindow выбран базовым, так как с помощью него можно использовать XML, например, чтобы определить структуру меню нашего приложения.<br />
<br />
===mainwindow.h===<br />
<code cppqt n><br />
#ifndef MAINWINDOW_H<br />
#define MAINWINDOW_H<br />
<br />
#include <KXmlGuiWindow><br />
#include <KTextEdit><br />
<br />
class MainWindow : public KXmlGuiWindow<br />
{<br />
public:<br />
MainWindow(QWidget *parent=0);<br />
<br />
private:<br />
KTextEdit* textArea;<br />
};<br />
<br />
#endif<br />
</code><br />
Сначала в строке 7 мы объявляем производный от KXmlGuiWindow класс: <tt>class MainWindow : public KXmlGuiWindow</tt>, а затем - конструктор <tt>MainWindow(QWidget *parent=0);</tt>.<br />
<br />
И наконец, объявляем указатель на объект, который станет главной частью нашей программы. {{class|KTextEdit}} является базовым редактором текста в формате richtext, поддерживающем некоторые вкусности KDE, как, например, автоматическое скрытие курсора.<br />
<br />
===mainwindow.cpp===<br />
<code cppqt n><br />
#include "mainwindow.h"<br />
<br />
MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent)<br />
{<br />
textArea = new KTextEdit;<br />
setCentralWidget(textArea);<br />
setupGUI();<br />
}<br />
</code><br />
Сначала, конечно же, в строке 1 мы включаем заголовочный файл, содержащий объявление класса.<br />
<br />
В строке 5 создаётся объект нашего текстового редактора. Затем в строке 6 мы используем встроенную функцию setCentralWidget(), указывающую KXmlGuiWindow, что должно находиться в центральной секции нашего окна.<br />
<br />
Наконец, вызывается функция KXmlGuiWindow::setupGUI(), фоново выполняющая много различных действий по инициализации GUI и создающая панель меню по умолчанию (Settings, Help).<br />
<br />
<br />
==Создание main.cpp==<br />
Чтобы завершить создание приложения, нужно написать пару строк в main.cpp:<br />
===main.cpp===<br />
<code cppqt n><br />
#include <KApplication><br />
#include <KAboutData><br />
#include <KCmdLineArgs><br />
<br />
#include "mainwindow.h"<br />
<br />
int main (int argc, char *argv[])<br />
{<br />
KAboutData aboutData( "tutorial2", 0,<br />
ki18n("Tutorial 2"), "1.0",<br />
ki18n("A simple text area"),<br />
KAboutData::License_GPL,<br />
ki18n("Copyright (c) 2007 Developer") );<br />
KCmdLineArgs::init( argc, argv, &aboutData );<br />
<br />
KApplication app;<br />
<br />
MainWindow* window = new MainWindow();<br />
window->show();<br />
<br />
return app.exec();<br />
}<br />
</code><br />
Новыми (по сравнению с Уроком 1) являются только строки 18 и 19. В строке 18 мы создаём объект MainWindow и в строке 19 делаем его видимым.<br />
<br />
==CMake==<br />
Наилучший способ собрать наше приложение - использовать CMake. Все изменения по сравнению с уроком 1 заключаются в добавлении файла <tt>mainwindow.cpp</tt> в список исходников и смене названия <tt>tutorial1</tt> на <tt>tutorial2</tt>.<br />
<br />
===CMakeLists.txt===<br />
<code ini><br />
project (tutorial2)<br />
<br />
find_package(KDE4 REQUIRED)<br />
include_directories( ${KDE4_INCLUDES} )<br />
<br />
set(tutorial2_SRCS <br />
main.cpp<br />
mainwindow.cpp<br />
)<br />
<br />
kde4_add_executable(tutorial2 ${tutorial2_SRCS})<br />
target_link_libraries( tutorial2 ${KDE4_KDEUI_LIBS})<br />
</code><br />
<br />
===Компиляция===<br />
Скомпилировать, скомпоновать и запустить приложение:<br />
cmake . && make && ./tutorial2<br />
<br />
==Продолжим изучение==<br />
Теперь можно перейти к статье о [[Development/Tutorials/Using_KActions|KActions]].<br />
<br />
[[Category:C++]]</div>Kradio5