Development/Tutorials/Using KActions (ru): Difference between revisions

    From KDE TechBase
    No edit summary
     
    (18 intermediate revisions by 6 users not shown)
    Line 1: Line 1:
    {{Template:I18n/Language Navigation Bar|Development/Tutorials/Using_KActions}}
     


    {{TutorialBrowser|
    {{TutorialBrowser|
    Line 5: Line 5:
    series=Beginner Tutorial|
    series=Beginner Tutorial|


    name=Использование KActions и XmlGui|
    name=Использование KActions и XMLGUI|


    pre=[[Development/Tutorials/Using_KXmlGuiWindow_(ru)|Урок 2 - KXmlGuiWindow]], Basic XML knowledge|
    pre=[[Development/Tutorials/Using_KXmlGuiWindow_(ru)|Урок 2 - KXmlGuiWindow]], Basic XML knowledge|


    next=TODO (milliams)|  
    next=[[Development/Tutorials/Saving_and_loading_(ru)|Урок 4 - Сохранение и загрузка]]|


    reading=None
    reading=None
    Line 15: Line 15:


    ==Введение==
    ==Введение==
    В данном уроке представлена базовая информация по работе с элементами actions (действиями). Использование действий является наиболее общим способом создания интерактивности программы.
    В данном уроке представлена базовая информация по работе с элементами actions (действиями). Действия -- центральная концепция при реализации интерактивности программы.
     
    Например, требуется очищать текстовое поле нажатием кнопки на панели инструментов, клавиши быстрого выбора или при использовании какого-либо пункта меню File. Это можно обеспечить при помощи одного {{class|KAction}} (действия).


    Например, если нужно, чтобы пользователь приложения [[Development/Tutorials/Using_KXmlGuiWindow| с урока 2 ]] мог очищать текстовое поле нажатием кнопки на панели инстрментов, комбинацией клавиш или выбрав некоторый пункт меню, то всё это можно реализовать с помощью одного класса {{class|KAction}}.


    [[image:introtokdetutorial3.png|frame|center]]
    [[image:introtokdetutorial3.png|frame|center]]
    Line 25: Line 24:
    Объект класса {{class|KAction}} хранит информацию о значке и клавише быстрого вызова, связанных с определённым действием. Действие может быть соединено со [http://doc.trolltech.com/latest/signalsandslots.html слотом], обрабатывающем его.
    Объект класса {{class|KAction}} хранит информацию о значке и клавише быстрого вызова, связанных с определённым действием. Действие может быть соединено со [http://doc.trolltech.com/latest/signalsandslots.html слотом], обрабатывающем его.


    == Листинг кода ==


    ===Создание действий===
    ===main.cpp===
    <syntaxhighlight lang="cpp-qt" line>
    #include <KApplication>
    #include <KAboutData>
    #include <KCmdLineArgs>


    Для создания действия в <tt>.cpp</tt> необходимо наличие <tt>#include <KAction></tt>
    #include "mainwindow.h"
    =====Создание объекта KAction=====
    Мы создадим действие, очищающее текстовое поле (см. Урок 2). KAction создаётся в несколько шагов. Первый - создание объекта KAction:
    <code cppqt>KAction* clearAction = new KAction(this);</code>
    Этот код создаёт действие <tt>clearAction</tt>.
     
    =====Текст=====
    Теперь, когда объект KAction создан, можно приступить к его настройке. Сначала, мы задаём текст, отображаемый в меню и под значком на панели инструментов.
    <code cppqt>clearAction->setText(i18n("Clear"));</code>
    Если планируется перевод интерфейса, то следует использовать функцию i18n для обработки текста.
     
     
    =====Значок=====
     
    При добавлении действий на панель инструментов можно задать значок, характеризующий выполняемое действие. Для этого следует просто вызвать функцию <tt>setIcon()</tt>, например:
    <code cppqt>clearAction->setIcon(KIcon("filenew"));</code>
    В данном примере с действием связывается стандартный значок KDE <tt>filenew</tt>.
     
    =====Клавиша быстрого вызова=====
     
    Также с действием можно связать клавишу быстрого вызова. Например, следующий фрагмент кода связывает с нашим действием комбинацию клавиш Ctrl+W:
    <code cppqt>clearAction->setShortcut(Qt::CTRL+Qt::Key_W);</code>
     
     
    =====Добавдение в набор (Collection)=====
     
    Чтобы сделать наше действие доступным системе XmlGui, следует добавить его в ''набор действий (action collection)'' приложения c помощью <tt>actionCollection()</tt> следующим образом:
    <code cppqt>
    actionCollection()->addAction("clear", clearAction);
    </code>
    В данном примере мы добавляем <tt>clearAction</tt> в коллекцию, задав имя ''clear''. Это имя используется системой XmlGui.


    int main (int argc, char *argv[])
    {
      KAboutData aboutData( "tutorial3", "tutorial3",
          ki18n("Tutorial 3"), "1.0",
          ki18n("A simple text area using KAction etc."),
          KAboutData::License_GPL,
          ki18n("Copyright (c) 2007 Developer") );
      KCmdLineArgs::init( argc, argv, &aboutData );
      KApplication app;
      MainWindow* window = new MainWindow();
      window->show();
      return app.exec();
    }
    </syntaxhighlight>
    Небольшие изменения конструктора KAboutData файла <tt>main.cpp</tt>. Теперь он будет показывать, что приложение принадлежит уроку 3.


    =====Соединение действий=====
    Теперь, когда действие полностью настроено, можно соединить его с действием <tt>clear()</tt>, принадлежащим KTextArea.
    <code cppqt>
    connect( clearAction, SIGNAL( triggered(bool) ),
            textArea, SLOT( clear() ) );
    </code>
    Это абсолютно идентично использованию {{qt|QAction}}.
    ===KStandardAction===
    Для часто используемых в KDE приложениях действий, таких, как quit', 'save', и 'load', существуют готовые KActions, доступные через класс {{class|KStandardAction}}.
    Их очень легко использовать. После включения заголовочного файла <tt><KStandardAction></tt> в ваш код, следует просто соединить их с функциями-обработчиками и добавить в соответствующую коллекцию (KActionCollection). Например, следующий код
    <code cppqt>KStandardAction::quit(kapp, SLOT(quit()), actionCollection());</code>
    создаст действие с соответствующим значком, текстом, клавишей быстрого вызова и даже добавит в меню File.
    ==The Code==
    ===mainwindow.h===
    ===mainwindow.h===
    <code cppqt n>
    <syntaxhighlight lang="cpp-qt" line>
    #ifndef MAINWINDOW_H
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    #define MAINWINDOW_H
    Line 90: Line 61:
    class MainWindow : public KXmlGuiWindow
    class MainWindow : public KXmlGuiWindow
    {
    {
    public:
      public:
         MainWindow(QWidget *parent=0);
         MainWindow(QWidget *parent=0);
    private:
      private:
         KTextEdit* textArea;
         KTextEdit* textArea;
         void setupActions();
         void setupActions();
    Line 99: Line 70:


    #endif
    #endif
    </code>
    </syntaxhighlight>
    Добавьте вызов функции <tt>void setupActions()</tt>, которая будет выполнять настройку KActions.


    ===mainwindow.cpp===
    ===mainwindow.cpp===
    <code cppqt n>
    <syntaxhighlight lang="cpp-qt" line>
    #include "mainwindow.h"
    #include "mainwindow.h"


    Line 112: Line 84:


    MainWindow::MainWindow(QWidget *parent)
    MainWindow::MainWindow(QWidget *parent)
    : KXmlGuiWindow(parent)
        : KXmlGuiWindow(parent)
    {
    {
       textArea = new KTextEdit;
       textArea = new KTextEdit;
    Line 124: Line 96:
       KAction* clearAction = new KAction(this);
       KAction* clearAction = new KAction(this);
       clearAction->setText(i18n("Clear"));
       clearAction->setText(i18n("Clear"));
       clearAction->setIcon(KIcon("filenew"));
       clearAction->setIcon(KIcon("document-new"));
       clearAction->setShortcut(Qt::CTRL+Qt::Key_W);
       clearAction->setShortcut(Qt::CTRL + Qt::Key_W);
       actionCollection()->addAction("clear", clearAction);
       actionCollection()->addAction("clear", clearAction);
       connect(clearAction, SIGNAL(triggered(bool)),
       connect(clearAction, SIGNAL(triggered(bool)),
    Line 135: Line 107:
       setupGUI();
       setupGUI();
    }
    }
    </code>
    </syntaxhighlight>


    ===main.cpp===
    <code cppqt n>
    #include <KApplication>
    #include <KAboutData>
    #include <KCmdLineArgs>


    #include "mainwindow.h"
    ==Объяснение==
    Приложение основано на исходном коде, приведённом в [[Development/Tutorials/Using_KXmlGuiWindow_(ru)|Уроке 2]]. Большинство изменений касаются <tt>mainwindow.cpp</tt>. Конструктор MainWindow теперь вместо <tt>setupGUI()</tt> вызывает <tt>setupActions()</tt>. KAction создаётся и настраивается в функции <tt>setupActions()</tt> до вызова <tt>setupGUI()</tt>.
     
     
     
    Для создания действия в <tt>.cpp</tt> необходимо наличие <tt>#include <KAction></tt>
    =====Создание объекта KAction=====
    Мы создадим действие, которое очищающает текстовое поле [[Development/Tutorials/Using_KXmlGuiWindow_(ru)|(см. Урок 2)]]. KAction создаётся в несколько шагов. Первый - включение заголовочного файла и создание объекта KAction:
    <syntaxhighlight lang="cpp-qt">
    #include <KAction>
    ...
    KAction* clearAction = new KAction(this);
    </syntaxhighlight>
    Этот код создаёт действие <tt>clearAction</tt>.
     
    ===Настройка свойств KAction===
     
    =====Текст=====
    Теперь, когда объект KAction создан, можно приступить к его настройке. Сначала, мы задаём текст, отображаемый в меню и под значком <tt>KAction</tt> на панели инструментов.
    <syntaxhighlight lang="cpp-qt">clearAction->setText(i18n("Clear"));</syntaxhighlight>
    Если планируется перевод интерфейса, то следует использовать функцию i18n для обработки текста (более подробную информацию можно получить в [[Development/Tutorials/Localization/i18n|уроке по i18n]]
     
     
    =====Значок=====
    В случае отображения действия на панели неплохо использовать значок, характеризующий это действие. Следующий код с помощью функции <tt>setIcon()</tt> устанавливает стандартный значок KDE <tt>document-new</tt>
    <syntaxhighlight lang="cpp-qt">clearAction->setIcon(KIcon("document-new"));</syntaxhighlight>
     
    =====Комбинация клавиш=====
    Связать комбинацию клавиш с нашим действием совершенно просто:
    <syntaxhighlight lang="cpp-qt">clearAction->setShortcut(Qt::CTRL + Qt::Key_W);</syntaxhighlight>
    Данный фрагмент кода связывает с нашим действием комбинацию клавиш Ctrl+W:
     
     
    =====Добавдение в набор (Collection)=====
     
    Чтобы сделать наше действие доступным системе XMLGUI (более подробное объяснение приведено дальше), следует добавить его в ''набор действий (action collection)'' приложения c помощью <tt>actionCollection()</tt> следующим образом:
    <syntaxhighlight lang="cpp-qt">
    actionCollection()->addAction("clear", clearAction);
    </syntaxhighlight>
    В данном примере мы добавляем <tt>clearAction</tt> в коллекцию, задав имя ''clear''. Это имя используется системой XMLGUI.
     
     
    =====Соединение действия с обработчиком=====
     
    Теперь, когда параметры внешнего вида действия определены, можно связать его с методом <tt>clear()</tt> объекта KTextArea.
    <syntaxhighlight lang="cpp-qt">
    connect( clearAction, SIGNAL( triggered(bool) ),
            textArea, SLOT( clear() ) );
    </syntaxhighlight>
    Интерфейс класса аналогичен {{qt|QAction}}, в KAction лишь добавлены специфические для KDE особенности.
     
    ===KStandardAction===
     
    Для часто используемых в KDE приложениях действий, таких, как quit, save, и load, доступны готовые объекты KAction, доступные через класс {{class|KStandardAction}}.
     
    Их очень легко использовать. После включения заголовочного файла <tt><KStandardAction></tt> в ваш код, следует просто соединить их с функциями-обработчиками и добавить в соответствующую коллекцию (KActionCollection). Например, следующий код


    int main (int argc, char *argv[])
    <syntaxhighlight lang="cpp-qt">KStandardAction::quit(kapp, SLOT(quit()), actionCollection());</syntaxhighlight>
    {
    создаст действие с соответствующим значком, текстом, клавишей быстрого вызова и даже добавит пункт в меню File.
      KAboutData aboutData( "tutorial3", "tutorial3",
          ki18n("Tutorial 3"), "1.0",
          ki18n("A simple text area using KAction etc."),
          KAboutData::License_GPL,
          ki18n("Copyright (c) 2007 Developer") );
      KCmdLineArgs::init( argc, argv, &aboutData );
      KApplication app;
      MainWindow* window = new MainWindow();
      window->show();
      return app.exec();
    }
    </code>




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


    На данном этапе действие "Clear" только создано: оно не будет отображено в меню или на панели управления. Чтобы задать, куда следует добавить действия (и позволить пользователю программы перемещать их), мы использем KDE-технологию XmlGui.  
    На данном этапе действие "Clear" только создано: оно не будет отображено в меню или на панели управления. Чтобы задать, куда следует добавить действия (и позволить пользователю программы перемещать их), следует использовать KDE-технологию XMLGUI.  
     
    {{note|В последующих версиях KDE4, XMLGUI может быть заменена на систему liveui. Но сейчас XMLGUI является единственным правильным способом настройки UI.}}


    ===XmlGui===


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


    При вызове функции <tt>setupGUI()</tt> в нашем классе (производном) {{class|KXmlGuiWindow}}, осуществляется обращение к системе XmlGui, которая читатет XML файл с описанием интерфейса (мы рассмотрим его позже) и создаёт кнопки и меню.
    При вызове функции <tt>setupGUI()</tt> в нашем классе (производном) {{class|KXmlGuiWindow}}, осуществляется обращение к системе XmlGui, которая читатет XML файл с описанием интерфейса (мы рассмотрим его позже) и создаёт кнопки и меню.
    Line 180: Line 190:


    ===tutorial3ui.rc===
    ===tutorial3ui.rc===
    <code xml n>
    <syntaxhighlight lang="xml" line>
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
    <gui name="tutorial3"
    <gui name="tutorial3" version="1">
        version="1"
        xmlns="http://www.kde.org/standards/kxmlgui/1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0
                            http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" >


      <ToolBar name="mainToolBar" >
        <text>Main Toolbar</text>
        <Action name="clear" />
      </ToolBar>
       <MenuBar>
       <MenuBar>
         <Menu name="file" >
         <Menu name="file" >
    Line 195: Line 205:
         </Menu>
         </Menu>
       </MenuBar>
       </MenuBar>
      <ToolBar name="mainToolBar" >
        <text>Main Toolbar</text>
        <Action name="clear" />
        <ActionList name="dynamicActionlist" />
      </ToolBar>
    </gui>
    </gui>
    </code>
    </syntaxhighlight>


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


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


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


    ===CMakeLists.txt===
    ===CMakeLists.txt===
    <code>
    <syntaxhighlight lang="text">
    project(tutorial3)
    project(tutorial3)


    Line 226: Line 244:
    install( FILES tutorial3ui.rc  
    install( FILES tutorial3ui.rc  
             DESTINATION  ${DATA_INSTALL_DIR}/tutorial3 )
             DESTINATION  ${DATA_INSTALL_DIR}/tutorial3 )
    </code>
    </syntaxhighlight>


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


    Однако, если вы хотите установить программу куда-либо, чтобы его проверить (было бы глупо устанавливать приложения с этих уроков в каталог KDE), следует напечатать:
    Однако, если вы хотите установить программу куда-либо, чтобы проверить её (было бы глупо устанавливать приложения с этих уроков в каталог KDE), следует напечатать:
      cmake . -DCMAKE_INSTALL_PREFIX=/home/kde-devel/kdetmp
      cmake . -DCMAKE_INSTALL_PREFIX=/home/kde-devel/kdetmp
    это создаст KDE-подобную структуру каталогов в ~/kdetmp и установит исполняемый файл в  
    это создаст KDE-подобную структуру каталогов в ~/kdetmp и установит исполняемый файл в  
    {{path|/home/kde-devel/kdetmp/bin/tutorial3}}.
    {{path|/home/kde-devel/kdetmp/bin/tutorial3}}.


    ==Продолжим изучение==
    ==Продолжим изучение==

    Latest revision as of 09:30, 14 July 2012


    Использование KActions и XMLGUI
    Tutorial Series   Beginner Tutorial
    Previous   Урок 2 - KXmlGuiWindow, Basic XML knowledge
    What's Next   Урок 4 - Сохранение и загрузка
    Further Reading   None

    Введение

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

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

    KAction

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

    Листинг кода

    main.cpp

    #include <KApplication>
    #include <KAboutData>
    #include <KCmdLineArgs>
    
    #include "mainwindow.h"
    
    int main (int argc, char *argv[])
    {
      KAboutData aboutData( "tutorial3", "tutorial3",
          ki18n("Tutorial 3"), "1.0",
          ki18n("A simple text area using KAction etc."),
          KAboutData::License_GPL,
          ki18n("Copyright (c) 2007 Developer") );
      KCmdLineArgs::init( argc, argv, &aboutData );
      KApplication app;
     
      MainWindow* window = new MainWindow();
      window->show();
      return app.exec();
    }
    

    Небольшие изменения конструктора KAboutData файла main.cpp. Теперь он будет показывать, что приложение принадлежит уроку 3.

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <KXmlGuiWindow>
    #include <KTextEdit>
    
    class MainWindow : public KXmlGuiWindow
    {
      public:
        MainWindow(QWidget *parent=0);
    	
      private:
        KTextEdit* textArea;
        void setupActions();
    };
    
    #endif
    

    Добавьте вызов функции void setupActions(), которая будет выполнять настройку KActions.

    mainwindow.cpp

    #include "mainwindow.h"
    
    #include <KApplication>
    #include <KAction>
    #include <KLocale>
    #include <KActionCollection>
    #include <KStandardAction>
    
    MainWindow::MainWindow(QWidget *parent)
        : KXmlGuiWindow(parent)
    {
      textArea = new KTextEdit;
      setCentralWidget(textArea);
    
      setupActions();
    }
    
    void MainWindow::setupActions()
    {
      KAction* clearAction = new KAction(this);
      clearAction->setText(i18n("Clear"));
      clearAction->setIcon(KIcon("document-new"));
      clearAction->setShortcut(Qt::CTRL + Qt::Key_W);
      actionCollection()->addAction("clear", clearAction);
      connect(clearAction, SIGNAL(triggered(bool)),
              textArea, SLOT(clear()));
    
      KStandardAction::quit(kapp, SLOT(quit()),
                            actionCollection());
    
      setupGUI();
    }
    


    Объяснение

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


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

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

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

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

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

    Настройка свойств KAction

    Текст

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

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

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


    Значок

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

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

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

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

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


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

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

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

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


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

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

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

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

    KStandardAction

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

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

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

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


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

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

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


    XMLGUI

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

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

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

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


    tutorial3ui.rc

    <?xml version="1.0" encoding="UTF-8"?>
    <gui name="tutorial3"
         version="1"
         xmlns="http://www.kde.org/standards/kxmlgui/1.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0
                             http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" >
    
      <MenuBar>
        <Menu name="file" >
          <text>&amp;File</text>
          <Action name="clear" />
        </Menu>
      </MenuBar>
    
      <ToolBar name="mainToolBar" >
        <text>Main Toolbar</text>
        <Action name="clear" />
        <ActionList name="dynamicActionlist" />
      </ToolBar>
    
    </gui>
    

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

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

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

    CMake

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

    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, описывающий пользовательский интерфейс.

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

    Если у вас нет доступа к каталогу 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.

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

    TODO