Archive:Development/Tutorials/Using KParts (zh CN)

    From KDE TechBase
    Revision as of 05:03, 22 February 2009 by Hualiang.miao (talk | contribs)


    Development/Tutorials/Using_KParts


    如何使用KParts
    Tutorial Series   插件和KParts
    Previous   教程五 -命令行参数
    What's Next   n/a
    Further Reading   KParts文档

    介绍

    KPart technology is used in kde to reuse GUI components. The advantage that a KPart presents is that it comes with predefined toolbar actions. By using kparts in applications developers can spend less time implementing text editor or command line features, for example and just use a katepart or a konsolepart instead. KParts are also used with Plugin technology to embed applications inside another, such as integrating PIM applications into Kontact.

    This tutorial will show you how to use a KPart in your application, and how to create your own KPart.

    使用Katepart

    Simple KDE applications use a MainWindow derived from KMainWindow (such as in previous tutorials). To use a KPart in an application, the MainWindow must instead be derived from KParts::MainWindow. This will then take care of integrating the toolbar and menu items of the kpart together.

    下面代码创建一个有KPart的KParts::MainWindow。

    main.cpp

    1. include <KApplication>
    2. include <KAboutData>
    3. include <KCmdLineArgs>
    4. include <KUrl>
    1. include "mainwindow.h"

    int main (int argc, char *argv[]) {

       KAboutData aboutData( "kparttutorial1", "kparttutorial1",
           ki18n("KPart Tutorial 1"), "0.1",
           ki18n("A MainWindow for a KatePart."),
           KAboutData::License_GPL,
           ki18n("Copyright (c) 2007 Developer") );
       KCmdLineArgs::init( argc, argv, &aboutData );
    
       KCmdLineOptions options;
       options.add("+[file]", ki18n("Document to open"));
       KCmdLineArgs::addCmdLineOptions(options);
    
       KApplication app;
    
       MainWindow* window = new MainWindow();
       window->show();
    
       KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
       if(args->count())
       {
           window->load(args->url(0).url());
       }
    
       return app.exec();
    

    }

    这个main.cpp文件和教程五 -命令行参数里用的一样。唯一的不同就是KAboutData的一些具体内容。

    mainwindow.h

    1. ifndef KPARTTUTORIAL1_H
    2. define KPARTTUTORIAL1_H
    1. include <kparts/mainwindow.h>

    /**

    * This is the application "Shell".  It has a menubar, toolbar, and
    * statusbar but relies on the "Part" to do all the real work.     
    *                                                                 
    * @short Application Shell                                        
    * @author Developer <[email protected]>                           
    * @version 0.1
    */
    

    class MainWindow : public KParts::MainWindow {

       Q_OBJECT
    

    public:

       /**
        * 缺省构造寒食。
        */
       MainWindow();
    
       /**
        * 缺省析构函数。
        */
       virtual ~MainWindow();
    
       /**
        * 用于加载文件或URL。
        */
       void load(const KUrl& url);
    
       /**
        * 显示打开URL的对话框,加载输入的URL。
        */
       void load();
    

    private:

       void setupActions();
    

    private:

       KParts::ReadWritePart *m_part;
    

    };

    1. endif // KPARTTUT1_H

    mainwindow.h文件很简单。注意这里MainWindow类从KParts::MainWindow继承而来。

    mainwindow.cpp

    1. include "mainwindow.h"
    1. include <kaction.h>
    2. include <kactioncollection.h>
    3. include <kconfig.h>
    4. include <kedittoolbar.h>
    5. include <kfiledialog.h>
    6. include <kshortcutsdialog.h>
    7. include <klibloader.h>
    8. include <kmessagebox.h>
    9. include <kstandardaction.h>
    10. include <kstatusbar.h>
    11. include <kurl.h>
    1. include <QApplication>

    MainWindow::MainWindow()

       : KParts::MainWindow( )
    

    {

       // 设置定制动作(actions)
       setupActions();
    
       //加载定制,本地Part的例行调用。
       KLibFactory *factory = KLibLoader::self()->factory("katepart");
       if (factory)
       {
           // Part已被加载,我们把它转换到我们要的,并通过它来进一步操作
           m_part = static_cast<KParts::ReadWritePart *>
                    (factory->create(this, "KatePart" ));
    
           if (m_part)
           {
               // 告诉KParts::MainWindow,这是个主widget
               setCentralWidget(m_part->widget());
    
               setupGUI(ToolBar | Keys | StatusBar | Save);
    
               //将part的GUI与shell继承
               createGUI(m_part);
           }
       }
       else
       {
           // if we couldn't find our Part, we exit since the Shell by
           // itself can't do anything useful
           KMessageBox::error(this, "Could not find our Part!");
           qApp->quit();
           // we return here, cause qApp->quit() only means "exit the
           // next time we enter the event loop...
           return;
       }
    

    }

    MainWindow::~MainWindow() { }

    void MainWindow::load(const KUrl& url) {

       m_part->openUrl( url );
    

    }

    void MainWindow::setupActions() {

       KStandardAction::open(this, SLOT(fileOpen()), 
           actionCollection());
       KStandardAction::quit(qApp, SLOT(closeAllWindows()),
           actionCollection());
    

    }

    void MainWindow::load() {

       load(KFileDialog::getOpenUrl());
    

    }

    mainwindow.cpp文件有MainWindow的实现。它的构造函数包含所有加载KPart的代码。

    First it sets up the actions used by the main window (Open and Quit), and then sets up the gui elements to go with these items (toolbar items, menu items, keyboard shortcuts). Next is the standard code used to load the KPart. The createGUI method is responsible for merging the toolbars and menus of the KPart with the rest of the application.

    kparttut1ui.rc

    <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> <kpartgui name="kparttut1" version="1"> <MenuBar>

     <Menu noMerge="1" name="file"><text>&File</text>
       <Action name="file_open"/>
       <Separator/>
       <Merge/>
       <Separator/>
       <Action name="file_quit"/>
     </Menu>
    
     <Merge />
    

    </MenuBar> <ToolBar noMerge="1" name="mainToolBar"><text>Main Toolbar</text>

     <Action name="file_open"/>
     <Merge/>
    

    </ToolBar> </kpartgui>

    kparttut1ui.rc文件用来定义Part中的动作(Action)如何于主窗口的动作(Action)合并起来。这些<Merge /> element in the file menu for example indicates that any part containing actions in a file menu should list its parts after the file_open action and before the file_quit action.

    CMakeLists.txt

    project(kparttut1)

    FIND_PACKAGE(KDE4 REQUIRED) INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . )

    set(kparttut1_SRCS

      main.cpp
      mainwindow.cpp
    )
    

    kde4_add_executable(kparttut1 ${kparttut1_SRCS})

    target_link_libraries(kparttut1 ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS})

                        1. install files ###############

    install(TARGETS kparttut1 DESTINATION ${BIN_INSTALL_DIR} ) install( FILES kparttut1ui.rc

       DESTINATION  ${DATA_INSTALL_DIR}/kparttut1 )
    

    这里,CMakeLists.txt文件很简单。

    运行

    编译后,用下列方式连接,安装:

    cmake . && make -j4 && make install
    

    可以这样执行:

    kparttut1 filename
    

    文件名filename就是要加在的文本文件。源代码文件也可以。

    When the file loads you will have a full-featured kate editor running in its own window. All of the editor features of kate are available in the toolbars and menu.

    You will notice that the 'Open' action you defined in the MainWindow class has also appeared in the toolbar and in the menu along with the 'Quit' action.

    下一个教程会讲述如何在应用程序里使用,重用你创建的KPart。