KDE TechBase
  • Page
  • Discussion
  • Edit
  • History
KDE TechBase is a Wiki - You can help! Please contribute! Questions?
Please ask development related questions in the KDE Community Forum.

Development/Tutorials/Using KActions (ru)

< Development | Tutorials

Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenščina | српски | Українська | 简体中文 | 繁體中文

Использование KActions и XMLGUI
Tutorial Series   Beginner Tutorial
Prerequisites   Урок 2 - KXmlGuiWindow, Basic XML knowledge
What's Next   Tutorial 4 - Saving and loading
Further Reading   None

Contents

  • 1 Введение
  • 2 KAction
  • 3 Листинг кода
    • 3.1 main.cpp
    • 3.2 mainwindow.h
    • 3.3 mainwindow.cpp
  • 4 Объяснение
    • 4.1 Создание объекта KAction
    • 4.2 Настройка свойств KAction
      • 4.2.1 Текст
      • 4.2.2 Значок
      • 4.2.3 Комбинация клавиш
      • 4.2.4 Добавдение в набор (Collection)
      • 4.2.5 Соединение действия с обработчиком
    • 4.3 KStandardAction
  • 5 Добавление действия в меню и на панель управления
    • 5.1 XMLGUI
    • 5.2 Создание файла appnameui.rc
    • 5.3 tutorial3ui.rc
  • 6 CMake
    • 6.1 CMakeLists.txt
    • 6.2 Сборка, установка и запуск
  • 7 Продолжим изучение

[edit] Введение

В данном уроке представлена базовая информация по работе с элементами actions (действиями). Действия -- центральная концепция при реализации интерактивности программы.

Например, если нужно, чтобы пользователь приложения с урока 2 мог очищать текстовое поле нажатием кнопки на панели инстрментов, комбинацией клавиш или выбрав некоторый пункт меню, то всё это можно реализовать с помощью одного класса KAction.

[edit] KAction

Объект класса KAction хранит информацию о значке и клавише быстрого вызова, связанных с определённым действием. Действие может быть соединено со слотом, обрабатывающем его.

[edit] Листинг кода

[edit] main.cpp

  1. #include <KApplication>
  2. #include <KAboutData>
  3. #include <KCmdLineArgs>
  4.  
  5. #include "mainwindow.h"
  6.  
  7. int main (int argc, char *argv[])
  8. {
  9. KAboutData aboutData( "tutorial3", "tutorial3",
  10. ki18n("Tutorial 3"), "1.0",
  11. ki18n("A simple text area using KAction etc."),
  12. KAboutData::License_GPL,
  13. ki18n("Copyright (c) 2007 Developer") );
  14. KCmdLineArgs::init( argc, argv, &aboutData );
  15. KApplication app;
  16.  
  17. MainWindow* window = new MainWindow();
  18. window->show();
  19. return app.exec();
  20. }

This time, very little has changed in main.cpp, only the KAboutData constructor has been updated to show that we are now on tutorial 3.

[edit] mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <KXmlGuiWindow>
  5. #include <KTextEdit>
  6.  
  7. class MainWindow : public KXmlGuiWindow
  8. {
  9. public:
  10. MainWindow(QWidget *parent=0);
  11.  
  12. private:
  13. KTextEdit* textArea;
  14. void setupActions();
  15. };
  16.  
  17. #endif

Only a function void setupActions() has been added which will do all the work setting up the KActions.

[edit] mainwindow.cpp

  1. #include "mainwindow.h"
  2.  
  3. #include <KApplication>
  4. #include <KAction>
  5. #include <KLocale>
  6. #include <KActionCollection>
  7. #include <KStandardAction>
  8.  
  9. MainWindow::MainWindow(QWidget *parent)
  10. : KXmlGuiWindow(parent)
  11. {
  12. textArea = new KTextEdit;
  13. setCentralWidget(textArea);
  14.  
  15. setupActions();
  16. }
  17.  
  18. void MainWindow::setupActions()
  19. {
  20. KAction* clearAction = new KAction(this);
  21. clearAction->setText(i18n("Clear"));
  22. clearAction->setIcon(KIcon("document-new"));
  23. clearAction->setShortcut(Qt::CTRL + Qt::Key_W);
  24. actionCollection()->addAction("clear", clearAction);
  25. connect(clearAction, SIGNAL(triggered(bool)),
  26. textArea, SLOT(clear()));
  27.  
  28. KStandardAction::quit(kapp, SLOT(quit()),
  29. actionCollection());
  30.  
  31. setupGUI();
  32. }


[edit] Объяснение

Приложение основано на исходном коде, приведённом в Уроке 2. Большинство изменений касаются mainwindow.cpp. Конструктор MainWindow теперь вместо setupGUI() вызывает setupActions(). KAction создаётся и настраивается в функции setupActions() до вызова setupGUI().


Для создания действия в .cpp необходимо наличие #include <KAction>

[edit] Создание объекта KAction

Мы создадим действие, которое очищающает текстовое поле (см. Урок 2). KAction создаётся в несколько шагов. Первый - включение заголовочного файла и создание объекта KAction:

#include <KAction>
...
KAction* clearAction = new KAction(this);

Этот код создаёт действие clearAction.

[edit] Настройка свойств KAction

[edit] Текст

Теперь, когда объект KAction создан, можно приступить к его настройке. Сначала, мы задаём текст, отображаемый в меню и под значком KAction на панели инструментов.

clearAction->setText(i18n("Clear"));

Если планируется перевод интерфейса, то следует использовать функцию i18n для обработки текста (более подробную информацию можно получить в уроке по i18n


[edit] Значок

В случае отображения действия на панели неплохо использовать значок, характеризующий это действие. Следующий код с помощью функции setIcon() устанавливает стандартный значок KDE document-new

clearAction->setIcon(KIcon("document-new"));
[edit] Комбинация клавиш

Связать комбинацию клавиш с нашим действием совершенно просто:

clearAction->setShortcut(Qt::CTRL + Qt::Key_W);

Данный фрагмент кода связывает с нашим действием комбинацию клавиш Ctrl+W:


[edit] Добавдение в набор (Collection)

Чтобы сделать наше действие доступным системе XMLGUI (более подробное объяснение приведено дальше), следует добавить его в набор действий (action collection) приложения c помощью actionCollection() следующим образом:

actionCollection()->addAction("clear", clearAction);

В данном примере мы добавляем clearAction в коллекцию, задав имя clear. Это имя используется системой XMLGUI.


[edit] Соединение действия с обработчиком

Теперь, когда параметры внешнего вида действия определены, можно связать его с методом tt>clear()</tt> объекта KTextArea.

connect( clearAction, SIGNAL( triggered(bool) ), 
textArea, SLOT( clear() ) );

Интерфейс класса аналогичен QAction, в KAction лишь добавлены специфические для KDE особенности.

[edit] KStandardAction

Для часто используемых в KDE приложениях действий, таких, как quit, save, и load, доступны готовые объекты KAction, доступные через класс KStandardAction.

Их очень легко использовать. После включения заголовочного файла <KStandardAction> в ваш код, следует просто соединить их с функциями-обработчиками и добавить в соответствующую коллекцию (KActionCollection). Например, следующий код

KStandardAction::quit(kapp, SLOT(quit()), actionCollection());

создаст действие с соответствующим значком, текстом, клавишей быстрого вызова и даже добавит пункт в меню File.


[edit] Добавление действия в меню и на панель управления

На данном этапе действие "Clear" только создано: оно не будет отображено в меню или на панели управления. Чтобы задать, куда следует добавить действия (и позволить пользователю программы перемещать их), следует использовать KDE-технологию XMLGUI.


Note
noframe
В последующих версиях KDE4, XMLGUI может быть заменена на систему liveui. Но сейчас XMLGUI является единственным правильным способом настройки UI.



[edit] XMLGUI

При вызове функции setupGUI() в нашем классе (производном) KXmlGuiWindow, осуществляется обращение к системе XmlGui, которая читатет XML файл с описанием интерфейса (мы рассмотрим его позже) и создаёт кнопки и меню.

Очевидно, что XmlGui требуется знать, какой файл является файлом описания, т.е. его имя и расположение. По установленному правилу имя файла должно быть appnameui.rc (где appname является именем, заданным в KAboutData), таким образом, в нашем примере файл должен быть назван tutorial3ui.rc. Его расположение определяется CMake.

[edit] Создание файла appnameui.rc

В связи с тем, что UI описывается на языке XML, порядок описания должен придерживаться строгих правил. В данном уроке мы не станем подробно рассказывать обо всех правилах, но для получения большей информации рекомендуется посмотреть страницу _с_подробным_описанием_XML (когда у нас будет статья с полным описанием XmlGui (или, возможно, liveui, если эта система будет реализована :)) здесь будет соответсвующая ссылка).


[edit] tutorial3ui.rc

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <gui name="tutorial3"
  3. version="1"
  4. xmlns="http://www.kde.org/standards/kxmlgui/1.0"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0
  7. http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" >
  8.  
  9. <MenuBar>
  10. <Menu name="file" >
  11. <text>&amp;File</text>
  12. <Action name="clear" />
  13. </Menu>
  14. </MenuBar>
  15.  
  16. <ToolBar name="mainToolBar" >
  17. <text>Main Toolbar</text>
  18. <Action name="clear" />
  19. <ActionList name="dynamicActionlist" />
  20. </ToolBar>
  21.  
  22. </gui>

Тэг <Toolbar> служит для описания панели инструментов (toolbar). Панель инструментов - это панель со значками, находящаяся в верхней части окна. В данном примере она получила уникальное имя mainToolBar и с помощью <text> видимое пользователю имя Main Toolbar, также мы добавляем на панель наше действие, используя тэг <Action>. Значение, заданное в параметре name, должно быть идентичным строке, переданной функции addAction() в нашем С++ коде.

Теперь можно добавить действие в меню. Для этого мы используем тэг <MenuBar>, в остальном всё абсолютно идентично выше описаному. Заметьте, что таким же способом можно динамически добавлять список действий, используя тэг <ActionList>. Для получения более подробной информации обратитесь к документации по методу plugActionList() класса KXMLGUIClient.

При изменении .rc файла следует изменять атрибут 'version', чтобы обновить кэш.

[edit] CMake

Из-за того, что был использован XmlGui, необходимо копировать tutorial3ui.rc туда, где KDE сможет его найти. Это означает, что необходимо куда-нибудь установить наш проект.

[edit] CMakeLists.txt

project(tutorial3)
 
find_package(KDE4 REQUIRED)
include_directories( ${KDE4_INCLUDES} )
 
set(tutorial3_SRCS
main.cpp
mainwindow.cpp
)
 
kde4_add_executable(tutorial3 ${tutorial3_SRCS})
 
target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})
 
install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})
install( FILES tutorial3ui.rc
DESTINATION ${DATA_INSTALL_DIR}/tutorial3 )

Данный файл почти идентичен файлу со второго урока, но имеет две дополнительные строки. Они как раз и описывают, куда должны быть установлены файлы. Сначала в BIN_INSTALL_DIR будет установлен tutorial3 (бинарный файл, target), затем в каталог приложения (data directory) - файл tutorial3ui.rc, описывающий пользовательский интерфейс.

[edit] Сборка, установка и запуск

Если у вас нет доступа к каталогу KDE4, то приложение можно установить в папку домашнего каталога.

Чтобы указать CMake, куда следует установить программу, нужно использовать переменную DCMAKE_INSTALL_PREFIX. Таким образом, чтобы установить программу в каталог KDE, выполните:

cmake . -DCMAKE_INSTALL_PREFIX=$KDEDIR
make install
tutorial3

Однако, если вы хотите установить программу куда-либо, чтобы проверить её (было бы глупо устанавливать приложения с этих уроков в каталог KDE), следует напечатать:

cmake . -DCMAKE_INSTALL_PREFIX=/home/kde-devel/kdetmp

это создаст KDE-подобную структуру каталогов в ~/kdetmp и установит исполняемый файл в /home/kde-devel/kdetmp/bin/tutorial3.

[edit] Продолжим изучение

TODO

Retrieved from "http://techbase.kde.org/Development/Tutorials/Using_KActions_(ru)"
Categories: Tutorial | C++

Navigation

  • Home
  • Help
  • Recent changes

Sections

  • Getting started
  • Development
  • Schedules
  • Policies
  • Contribute
  • Projects

Toolbox

  • What links here
  • Related changes
  • Special pages
  • Printable version
  • Permanent link

Personal tools

  • Log in / create account
  • Login with OpenID
Creative Commons License SA 3.0 as well as the GNU Free Documentation License 1.2
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal