Development/Tutorials/Writing kontact plugins

    From KDE TechBase
    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.

    Kontact plugins are KParts that get loaded at runtime. To integrate your KPart into kontact, you will need to have a .desktop file like this:

    ls /home/kde-devel/kde/share/kde4/services/kontact/
    akregatorplugin.desktop     knotesplugin.desktop
    akregatorplugin3.2.desktop  korganizerplugin.desktop
    journalplugin.desktop       newstickerplugin.desktop
    kaddressbookplugin.desktop  plannerplugin.desktop
    karmplugin.desktop          specialdatesplugin.desktop
    kmailplugin.desktop         summaryplugin.desktop
    kmobiletools.desktop        todoplugin.desktop
    knodeplugin.desktop         weatherplugin.desktop
    

    Writing a KPart

    The following is what you do

    • write a subclass mypart of KParts::Part
      • because setWidget is protected
      • use a Widget in it and use setWidget to get your widget into the KPart
    • write a subclass mypartmainwindow of KParts::MainWindow
    • write main.cpp
      • use new mypart(mw) to get your part into your main window

    CMakeLists.txt

    PROJECT( kdepart )
    FIND_PACKAGE(KDE4 REQUIRED)
    INCLUDE_DIRECTORIES(${KDE4_INCLUDES} .)
    
    SET(kdepartSources main.cpp mypart.cpp)
    
    KDE4_ADD_EXECUTABLE(kdepart ${kdepartSources})
    
    TARGET_LINK_LIBRARIES(kdepart ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS})
    

    main.cpp

    1. include <QString>
    2. include <kapplication.h>
    3. include <kaboutdata.h>
    4. include <kmessagebox.h>
    5. include <klistwidget.h>
    6. include <kparts/mainwindow.h>
    7. include <kparts/part.h>
    8. include <ktextedit.h>
    9. include <kcmdlineargs.h>
    10. include <KMainWindow>
    11. include <KPushButton>
    12. include "mypart.h"

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

     const QByteArray& ba=QByteArray("test");
     const KLocalizedString name=ki18n("myName");
     KAboutData aboutData( ba, ba, name, ba, name);
     KCmdLineArgs::init( argc, argv, &aboutData );
     KApplication khello;
     mypartmainwindow* mw=new mypartmainwindow();
     //mypart* mypart1=new mypart(mw);
     //KPushButton* button=new KPushButton("ha");
     //mypart1->setMainWidget(button);
     //mypart1->embed(mw);
     //KListWidget* klv=new KListWidget(mywidget);
     mw->show();
     khello.exec();
    

    } mypart.h

    1. include <KParts/Part>
    2. include <KParts/MainWindow>

    class mypart:public KParts::Part {

       Q_OBJECT
    

    public:

     mypart(QObject *parent=0);
    

    };

    class mypartmainwindow:public KParts::MainWindow {

       Q_OBJECT
    

    public:

     mypartmainwindow(QWidget* parent = 0, Qt::WindowFlags f = KDE_DEFAULT_WINDOWFLAGS);
    

    }; mypart.cpp

    1. include <kdebug.h>
    2. include <KPushButton>
    3. include "mypart.h"
    4. include <QWidget>

    mypart::mypart(QObject* parent) {

     kDebug() << "Entering mypart";
     QWidget* mywidget=new QWidget();
     KPushButton* button=new KPushButton("ho",mywidget);
     setWidget(mywidget);
    

    }

    mypartmainwindow::mypartmainwindow(QWidget* parent, Qt::WindowFlags f) {

     kDebug() << "Entering mypartmainwindow";
     mypart* mypart1=new mypart(this);
     mypart1->embed(this);
    

    }

    Compiling your kPart

    To compile, link and run the code above, use

    cmake . && make && ./kdepart
    

    Using your kPart

    You can use konqueror to display your kpart: konqueror -> Settings -> Configure Konqueror -> Web browsing -> Plugins

    See also