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

From KDE TechBase
Revision as of 12:04, 18 July 2012 by AnneW (talk | contribs)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


如何使用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

#include <KApplication>
#include <KAboutData>
#include <KCmdLineArgs>
#include <KUrl>
 
#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

#ifndef KPARTTUTORIAL1_H        
#define KPARTTUTORIAL1_H        
                                
#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;
};

#endif // KPARTTUT1_H

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

mainwindow.cpp

#include "mainwindow.h"

#include <kaction.h>
#include <kactioncollection.h>
#include <kconfig.h>
#include <kedittoolbar.h>
#include <kfiledialog.h>
#include <kshortcutsdialog.h>
#include <klibloader.h>
#include <kmessagebox.h>
#include <kstandardaction.h>
#include <kstatusbar.h>
#include <kurl.h>

#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

<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
<kpartgui name="kparttut1" version="1">
<MenuBar>
  <Menu noMerge="1" name="file"><text>&amp;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})

########### 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。