Development/Tutorials/Using KActions (ko)

< Development‎ | Tutorials
Revision as of 20:32, 29 June 2011 by Neverendingo (Talk | contribs) (Text replace - "<code cppqt n>" to "<syntaxhighlight lang="cpp-qt" line>")

Jump to: navigation, search


Development/Tutorials/Using_KActions


어떻게 KActions과 XMLGUI 사용하는가
Tutorial Series   Beginner Tutorial
Previous   튜트리얼 2 - KXmlGuiWindow, 기본 xml 지식
What's Next   튜트리얼 4 - Saving and loading
Further Reading   None

개요

이 튜트리얼은 액션의 개념에 대하여 소개한다. 액션은 우리의 프로그램과 상호작용하는 방식을 유저에게 지원하는 통합된 방법이다.

This tutorial introduces the concept of actions. Actions are a unified way of supplying the user with ways to interact with your program.

예를 들어 튜트리얼 2 에서 유저가 툴바 안의 버튼이나 파일메뉴의 옵션을 클릭하거나, 키보드 단축키를 통하여 텍스트 박스의 내용을 지우기를 원한다면, 하나의 KAction을 통하여 모든 것이 가능하도록 할 수 있다.

For example, if we wanted to let the user of Tutorial 2 clear the text box by clicking a button in the toolbar, from an option in the File menu or through a keyboard shortcut, it could all be done with one KAction.
Introtokdetutorial3.png

KAction

KAction은 특정 액션과 관계된 아이콘과 단축키에 대한 모든 정보를 포함하는 오브젝트이다. 액션은 액션의 작업을 수행하는 슬롯과 연결되어져 있다.

A KAction is an object which contains all the information about the icon and shortcuts that is associated with a certain action. The action is then connected to a slot which carries out the work of your action.

The Code

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 }
 21 </code>
 22 이번에는 <tt>main.cpp</tt>에서 아주 조금만 바뀌었다. 단지 KAboutData 생성자가 tutrial3으로 보여지도록 업데이트 되었을 뿐이다.
 23 :''This time, very little has changed in <tt>main.cpp</tt>, only the KAboutData constructor has been updated to show that we are now on tutorial 3.''
 24 
 25 ===mainwindow.h===
 26 <syntaxhighlight lang="cpp-qt" line>
 27 #ifndef MAINWINDOW_H
 28 #define MAINWINDOW_H
 29 
 30 #include <KXmlGuiWindow>
 31 #include <KTextEdit>
 32 
 33 class MainWindow : public KXmlGuiWindow
 34 {
 35   public:
 36     MainWindow(QWidget *parent=0);
 37 	
 38   private:
 39     KTextEdit* textArea;
 40     void setupActions();
 41 };
 42 
 43 #endif
 44 </code>
 45 <tt>void setupActions()</tt>함수는 단지 KActions 설정하는 모든 작업을 수행하도록 추가되어진다. 
 46 :''Only a function <tt>void setupActions()</tt> has been added which will do all the work setting up the KActions.''
 47 
 48 ===mainwindow.cpp===
 49 <syntaxhighlight lang="cpp-qt" line>
 50 #include "mainwindow.h"
 51 
 52 #include <KApplication>
 53 #include <KAction>
 54 #include <KLocale>
 55 #include <KActionCollection>
 56 #include <KStandardAction>
 57 
 58 MainWindow::MainWindow(QWidget *parent)
 59     : KXmlGuiWindow(parent)
 60 {
 61   textArea = new KTextEdit;
 62   setCentralWidget(textArea);
 63 
 64   setupActions();
 65 }
 66 
 67 void MainWindow::setupActions()
 68 {
 69   KAction* clearAction = new KAction(this);
 70   clearAction->setText(i18n("Clear"));
 71   clearAction->setIcon(KIcon("document-new"));
 72   clearAction->setShortcut(Qt::CTRL + Qt::Key_W);
 73   actionCollection()->addAction("clear", clearAction);
 74   connect(clearAction, SIGNAL(triggered(bool)),
 75           textArea, SLOT(clear()));
 76 
 77   KStandardAction::quit(kapp, SLOT(quit()),
 78                         actionCollection());
 79 
 80   setupGUI();
 81 }
 82 </code>
 83 
 84 ==설명==
 85 이것은 [[Development/Tutorials/Using_KXmlGuiWindow (ko)|Tutorial 2]]부터 KXmlGuiWindow 코드로 작성한다. 대부분의 바뀐 부분은 <tt>mainwindow.cpp</tt>이다. 중요한 구조적 변화  하나는 MainWindow 위해 setupGUI() 대신 setupAction() 수행한 것이다. <tt>setupActions()</tt> 마지막으로 스스로 <tt>setupGUI()</tt> 호출하기 전에, KAction 코드를 생성하는 곳이다.
 86 
 87 :''This builds upon the KXmlGuiWindow code from [[Development/Tutorials/Using_KXmlGuiWindow|Tutorial 2]]. Most of the changes are to <tt>mainwindow.cpp</tt>, an important structural change being that the constructor for MainWindow now calls <tt>setupActions()</tt> instead of <tt>setupGUI()</tt>. <tt>setupActions()</tt> is where the new KAction code goes before finally calling <tt>setupGUI()</tt> itself.''
 88 
 89 ===KAction 오브젝트 생성하기===
 90 The KAction  단계에 걸쳐서 생성된다. 처음으로 하는 일은 KAction 라이브러리를 추가하고 <tt>KAction</tt> 생성하는 것이다.:
 91 :''The KAction is built up in a number of steps. The first is including the <tt>KAction</tt> library and then creating the KAction:''
 92 <syntaxhighlight lang="cpp-qt">
 93 #include <KAction>
 94 ...
 95 KAction* clearAction = new KAction(this);
 96 </code>
 97 이것은 <tt>clearAction</tt>이라고 불리는 하나의 새로운 KAction 생성한다.
 98 :''This creates a new KAction called <tt>clearAction</tt>.''
 99 
100 ===KAction 속성 설정하기===
101 ====텍스트====
102 이제 우리는 KAction 오브젝트를 가지며, KAction 속성을 설정하는 것을 시작할  있다. 다음 코드는 메뉴와 툴바의 <tt>KAction</tt> 아이콘에서 보여질 텍스트를 설정한다. 
103 :''Now we have our KAction object, we can start setting its properties. The following code sets the text that will be displayed in the menu and under the <tt>KAction</tt>'s icon in the toolbar.''
104 <syntaxhighlight lang="cpp-qt">clearAction->setText(i18n("Clear"));</code>
105  텍스트가 i18n() 함수를 거쳤다는 것에 대하여 상기하라.; 이것은 UI에서 번역가능하도록 만들기 위해 필수적인 과정이다. (좀더 자세한 정보는 [[Development/Tutorials/Localization/i18n|i18n 튜트리얼]]에서 찾을  있다.) 
106 :''Note that the text is passed through the i18n() function; this is necessary for the UI to be translatable (more information on this can be found in the [[Development/Tutorials/Localization/i18n|i18n tutorial]]).''
107 
108 ====아이콘====
109 만약 액션이 툴바에서 보여지게 하려면, 액션을 묘사하는 아이콘을 가지도록 하는 것이 좋다. 다음 코드는 KDE 표준 "document-new" 아이콘을 <tt>setIcon()</tt> 함수를 사용하여 설정한다. :
110 :''If the action is going to be displayed in a toolbar, it's nice to have an icon depicting the action. The following code sets the icon to the standard KDE <tt>document-new</tt> icon through the use of the <tt>setIcon()</tt> function:''
111 <syntaxhighlight lang="cpp-qt">clearAction->setIcon(KIcon("document-new"));</code>
112 
113 ====키보드 단축키====
114 액션을 수행하는 키보드 단축키를 설정하는 것은 간단하다.:
115 :''Setting a keyboard shortcut to perform our action is equally simple:''
116 <syntaxhighlight lang="cpp-qt">clearAction->setShortcut(Qt::CTRL + Qt::Key_W);</code>
117 이것은 Ctrl+W KAction 연관시킨다. 
118 :''This associates Ctrl+W with the KAction.''
119 
120 ===Collection 추가하기===
121 XMLGUI 프레임워크(나중에 좀더 깊게 설명되어진다.) 의해 접근되어지는 액션이 차례대로 어플리케이션의 ''action collection''에 추가되어져야 한다. action collection 다음과 같이 <tt>actionCollection()</tt> 통해 접근된다.: 
122 :''In order for the action to be accessed by the XMLGUI framework (explained in depth later) it must be added to the application's ''action collection''. The action collection is accessed via the <tt>actionCollection()</tt> function like this: ''
123 <syntaxhighlight lang="cpp-qt">
124 actionCollection()->addAction("clear", clearAction);
125 </code>
126 여기 <tt>clearAction</tt> KAction collection 추가되어지며, clear라는 이름으로 붙여진다.  이름(''clear'') 액션을 참조하기 위해 XMLGUI 프레임워크이 사용한다.
127 :''Here, the <tt>clearAction</tt> KAction is added to the collection and given a name of ''clear''. This name (''clear'') is used by the XMLGUI framework to refer to the action.''
128 
129 ====액션 연결하기====
130 이제 완벽히 액션을 설정하려면,   유용하게 연결되어질 필요가 있다.  경우(텍스트 영역을 지우기를 원하므로), 우리는 KTextEdit 가지고 있는 (놀랍게도 KTextEdit 지우는)<tt>clear()</tt> 액션과 우리의 액션을 연결한다.
131 :''Now that the action is fully set up, it needs to be connected to something useful. In this case (because we want to clear the text area), we connect our action to the <tt>clear()</tt> action belonging to a KTextEdit (which, unsurprisingly, clears the KTextEdit)''
132 <syntaxhighlight lang="cpp-qt">
133 connect( clearAction, SIGNAL( triggered(bool) ), 
134          textArea, SLOT( clear() ) );
135 </code>
136 이것은 Qt에서 {{qt|QAction}} 수행되는 것과 같다. 
137 :''This is the same as it would be done in Qt with a {{qt|QAction}}.''
138 
139 ===KStandardAction===
140 모든 KDE 어플리케이션은 대부분 'quit', 'save', 'load'와 같은 액션을 위해, [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction]을 통해 접근되는 미리 만들어진 편리한 KAction이 존재한다. 
141 
142 :''For actions which would likely appear in almost every KDE application such as 'quit', 'save', and 'load' there are pre-created convenience KActions, accessed through [http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKStandardAction.html KStandardAction].''
143 
144 이것은 사용하는 것은 간단하다. 라이브러리에 한번 include 되어지며(<tt>#include <KStandardAction></tt>), 간단하게 당신이 수행하기를 원하는 함수와 함께 KActionCollection 추가되도록 이것을 지원하라. 예를 들어: 
145 :''They are very simple to use. Once the library has been included (<tt>#include <KStandardAction></tt>), simply supply it with what you want the function to do and which KActionCollection to add it to. For example:''
146 <syntaxhighlight lang="cpp-qt">KStandardAction::quit(kapp, SLOT(quit()), actionCollection());</code>
147 이것은 적절한 아이콘, 텍스트, 단축키을 가진 KAction 만들고, 파일 메뉴에도 추가한다.
148 :''This creates a KAction with the correct icon, text and shortcut and even adds it to the File menu.''
149 
150 ==메뉴와 툴바에 액션 추가하기==
151 잠깐동안 새로운 "Clear" 액션이 만들어진다. 그러나 이것은 어떠한 메뉴나 툴바에도 연관되어 있지 않다. 
152 이것을 수행하는 것은 유동적인 XMLGUI 불리는 KDE 기술이다. 
153 :''At the moment, the new "Clear" action has been created but it hasn't been associated with any menus or toolbars. This is done with a KDE technology called XMLGUI, which does nice things like movable toolbars for you.''
154 
155 {{note|KDE4 마지막 버전에서, XMLGUI liveui라고 불리는 새로운 프레임워크로 대신되어질 것이다. 현재는 XMLGUI만이 UI 설정하기 위한 적절한방법이다. }}
156 :''note|In a later version of KDE4, XMLGUI, may be replaced with a new framework called liveui. For now, XMLGUI, is the only and correct way to set up the UI.''
157 
158 ==XMLGUI==
159 {{class|KXmlGuiWindow}}에서 <tt>setupGUI()</tt> 함수는 XMLGUI 시스템에 의존적이며, XMLGUI 인터페이스 XML 파일을 파싱함으로써 GUI 생성한다.
160 :''The <tt>setupGUI()</tt> function in {{class|KXmlGuiWindow}} depends on the XMLGUI system to construct the GUI, which XMLGUI does by parsing an XML file description of the interface.''
161 
162  XML 파일에 이름을 붙이는 규정은 <tt>appnameui.rc</tt>이다. <tt>appname</tt>에는 {{class|KAboutData}}에서 설정한 이름( 경우 ''tutorial3'') 들어간다. 우리의 경우,  파일은 tutorial3ui.rc으로 이름지어지며, 빌드 디렉토리에 위치하게 된다. 파일이 마지막으로 위치할 곳은 CMake 의해 결정된다. 
163 :''The rule for naming this XML file is <tt>appnameui.rc</tt>, where <tt>appname</tt> is the name you set in {{class|KAboutData}} (in this case, ''tutorial3''). So in our example, the file is called <tt>tutorial3ui.rc</tt>, and is located in the build directory. Where the file will ultimately be placed is handled by CMake.''
164 
165 ==''appname''ui.rc File==
166 
167 UI XML 정의된 이후에 레이아웃은 엄격한 규칙에 따라야한다.  튜트리얼은  주제에 대하여 깊게 들어가지 않을 것이다. 그러나 좀더 정보가 필요하면, 세부화된 [[Development/Architecture/KDE4/XMLGUI_Technology (ko)|detailed XMLGUI page]] 살펴보라. 
168 :''Since the description of the UI is defined with XML, the layout must follow strict rules. This tutorial will not go into great depth on this topic, but for more information, see the [[Development/Architecture/KDE4/XMLGUI_Technology|detailed XMLGUI page]].''
169 
170 ===tutorial3ui.rc===
171 <code xml n>
172 <?xml version="1.0" encoding="UTF-8"?>
173 <gui name="tutorial3"
174      version="1"
175      xmlns="http://www.kde.org/standards/kxmlgui/1.0"
176      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
177      xsi:schemaLocation="http://www.kde.org/standards/kxmlgui/1.0
178                          http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd" >
179 
180   <MenuBar>
181     <Menu name="file" >
182       <Action name="clear" />
183     </Menu>
184   </MenuBar>
185 
186   <ToolBar name="mainToolBar" >
187     <text>Main Toolbar</text>
188     <Action name="clear" />
189   </ToolBar>
190 
191 </gui>
192 </code>
193 
194 <tt><Toolbar></tt> 태그는 아이콘과 함께 일반적으로 윈도우의 상단에 위치하는 툴바를 묘사한다. 여기에서는 ''mainToolBar''라는 독특한 이름이 붙여지며, 유저에게 보이는 이름은 <tt><text></tt> 태그를 사용하는 ''mainToolbar''로 설정된다. clear 액션은 <tt><Action></tt> 태그를 사용하는 툴바에 추가되어지며,  태그의 name 파라미터는 <tt>mainwindow.cpp</tt>에서 <tt>addAction()</tt>으로 KActionCollection으로 넘겨지는 문자열이 된다. 
195 :''The <tt><Toolbar></tt> tag allows you to describe the toolbar, which is the bar across the top of the window normally with icons. Here it is given the unique name ''mainToolBar'' and its user visible name set to ''Main Toolbar'' using the <tt><text></tt> tag. The clear action is added to the toolbar using the <tt><Action></tt> tag, the name parameter in this tag being the string that was passed to the KActionCollection with <tt>addAction()</tt> in <tt>mainwindow.cpp</tt>.''
196 
197 툴바에서 가지고 있는 액션은 메뉴바에도 추가된다. 여기서 액션은 툴바에서 추가되었던 방식과 같은 방식으로<tt>MenuBar</tt> ''File'' 메뉴에 추가되어진다. 
198 :''Besides having the action in the toolbar, it can also be added to the menubar. Here the action is being added to the ''File'' menu of the <tt>MenuBar</tt> the same way it was added to the toolbar.''
199 
200 
201 시스템 캐시를 업데이트하기 위한 마지막 설치 이후에, .rc 파일을 변경하였다면  <tt><nowiki><gui></nowiki></tt> 태그의 'version' 속성이 변경된다.
202 :''Change the 'version' attribute of the <tt><nowiki><gui></nowiki></tt> tag if you changed .rc file since the last install to force a system cache update.''
203 
204 ==CMake==
205 마지막으로 <tt>tutorial3ui.rc</tt> KDE 찾을  있는 어딘가로 이동할 필요가 있다.(소스 디렉토리에서는 벗어나지 못한다!) '''이것은 프로젝트가 어딘가로 옮겨질 필요가 있다는 것을 의미한다. '''
206 :''Finally, the <tt>tutorial3ui.rc</tt> needs to go somewhere where KDE can find it (can't just leave it in the source directory!). '''This means the project needs to be installed somewhere.'''''
207 ===CMakeLists.txt===
208 <code ini n>
209 project(tutorial3)
210 
211 find_package(KDE4 REQUIRED)
212 include_directories(${KDE4_INCLUDES})
213 
214 set(tutorial3_SRCS 
215   main.cpp
216   mainwindow.cpp
217 )
218 
219 kde4_add_executable(tutorial3 ${tutorial3_SRCS})
220 
221 target_link_libraries(tutorial3 ${KDE4_KDEUI_LIBS})
222 
223 install(TARGETS tutorial3 DESTINATION ${BIN_INSTALL_DIR})
224 install(FILES tutorial3ui.rc 
225         DESTINATION  ${DATA_INSTALL_DIR}/tutorial3)
226 </code>
227 
228  파일은 대부분 튜트리얼 2에서 확인하였다. 확인하지 않았던 마지막의  줄은 파일을 어디에 설치할지를 설명한다. 먼저 튜트리얼 3 타겟은 BIN_INSTALL_DIR 설치된다. 그리고 유저 인터페이스의 레이아웃을 묘사하는 <tt>tutorial3ui.rc</tt> 파일은 어플리케이션의 데이터 디렉토리에 설치된다. 
229 :''This file is almost identical to the one for tutorial2, but with two extra lines at the end that describe where the files are to be installed. Firstly, the <tt>tutorial3</tt> target is installed to the <tt>BIN_INSTALL_DIR</tt> then the <tt>tutorial3ui.rc</tt> file that describes the layout of the user interface is installed to the application's data directory.''
230 
231 ===Make, Install And Run===
232 만약 당신의 KDE4 설치 디렉토리에 대한 쓰기 권한을 가지지 않았다면, 당신의  디렉토리에 설치할  있다. 
233 :''If you don't have write access to where your KDE4 installation directory, you can install it to a folder in your home directory.''
234 
235 CMake 프로그램을 인스톨 하는 곳을 설정하기 위해서는, DCMAKE_INSTALL_PREFIX 스위치를 설정해야 한다. 아마 당신은 테스트를 위해 로컬 어디가에 그것을 설치하기를 원할 것이다.(당신의 KDE 디렉토리에  튜트리얼을 설치하는 것은 조금 바보스럽다.), 그러므로 정확히 다음과 실행하면  것이다. :
236 :''To tell CMake where to install the program, set the <tt>DCMAKE_INSTALL_PREFIX</tt> switch. You probably just want to install it somewhere local for testing (it's probably a bit silly to go to the effort of installing these tutorials to your KDE directory), so the following might be appropriate:''
237  mkdir build && cd build
238  cmake .. -DCMAKE_INSTALL_PREFIX=$HOME
239  make install
240  $HOME/bin/tutorial3
241 
242 :''which will create a KDE-like directory structure in your user's home directory directory and will install the executable to {{path|$HOME/bin/tutorial3}}.''
243 
244 ==나아가기==
245 :''이제 [[Development/Tutorials/Saving_and_loading (ko)|saving and loading]]으로 진행할  있다.''
246 :''Now you can move on to [[Development/Tutorials/Saving_and_loading|saving and loading]].''
247 
248 [[Category:C++]]

Content is available under Creative Commons License SA 4.0 unless otherwise noted.