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

    From KDE TechBase
    Revision as of 20:33, 29 June 2011 by Neverendingo (talk | contribs) (Text replace - "<code xml>" to "<syntaxhighlight lang="xml">")


    Development/Tutorials/Using_KParts


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

    介绍

    KPart技术是KDE用来重用图形界面组件的。出现的优势在于它预定义了工具条和一些相应动作(actions)。开发人员可以用KParts来实现一些文字编辑器和命令行功能,从而减少开发时间,例如在应用程序中使用KatePart或Konsolepart。 KParts同时采用插件技术,一个应用可以内嵌在另一个里面,就像PIM之于Kontact。

    本教程讲述如何在你的程序中使用KPart, 如何创建你自己的KPart.

    使用Katepart

    简单的KDE应用程序直接从KMainWindow继承一个MainWindow(见前叙教程)。如要使用KPart,那MainWindow必须从KParts::MainWindow集成下来。这个类会管理所有KPart的工具栏,菜单的集成。

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

    main.cpp

    <syntaxhighlight lang="cpp-qt">

    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

    <syntaxhighlight lang="cpp-qt">

    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

    <syntaxhighlight lang="cpp-qt">

    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
       {
           // 如果找不到Part, 我们就退出,因为Shell也干不了什么了
           KMessageBox::error(this, "Could not find our Part!");
           qApp->quit();
           // 从这里退出,qApp->quit()只是说下次进入循环的时候退出...
           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的代码。

    首先设置主窗口所使用的actions(打开,退出),然后设置图形界面元素(如工具栏,菜单项,键盘快捷键)。下一步就是加载KPart的标准代码了。createGUI方法负责把KPart的工具栏,菜单和程序其他部分集成起来。

    kparttut1ui.rc

    <syntaxhighlight lang="xml"> <!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在file_open action之后以及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就是要加在的文本文件。源代码文件也可以。

    文件加载后,你就有了一个全功能的Kate编辑器运行在你的程序窗口里。所有Kate编辑器的功能在工具栏和菜单里都有。

    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。