m (add Category:PIM) |
|||
| Line 23: | Line 23: | ||
<pre> | <pre> | ||
| − | + | project(hello) | |
| − | + | find_package (KDE4 REQUIRED) | |
| − | INCLUDE_DIRECTORIES(${KDE4_INCLUDES} .) | + | INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . ) |
| − | + | include_directories( ${KDE4_INCLUDE_DIR}/kcal ${CMAKE_SOURCE_DIR}/kresources/remote ) | |
| − | |||
| − | + | ########### next target ############### | |
| − | + | set(hello_shared_SRCS | |
| + | hello_part.cpp | ||
| + | ) | ||
| + | |||
| + | |||
| + | set(hellopart_PART_SRCS hello_part.cpp) | ||
| + | |||
| + | kde4_add_plugin(hellopart ${hellopart_PART_SRCS}) | ||
| + | |||
| + | target_link_libraries(hellopart ${KDE4_KPARTS_LIBS} ${KDE4_KCAL_LIBS} ${KDE4_KIO_LIBS} kdepim kcal_resourceremote) | ||
| + | if(X11_Xscreensaver_LIB) | ||
| + | target_link_libraries(hellopart ${X11_Xscreensaver_LIB} ) | ||
| + | endif(X11_Xscreensaver_LIB) | ||
| + | |||
| + | |||
| + | install(TARGETS hellopart DESTINATION ${PLUGIN_INSTALL_DIR}) | ||
| + | |||
| + | |||
| + | ########### install files ############### | ||
| + | |||
| + | install( FILES hello_part.desktop DESTINATION ${SERVICES_INSTALL_DIR}) | ||
</pre> | </pre> | ||
| − | == | + | == hello_part.h == |
<code cpp> | <code cpp> | ||
| − | # | + | #ifndef _HELLOPART_H_ |
| − | # | + | #define _HELLOPART_H_ |
| − | + | ||
#include <kparts/part.h> | #include <kparts/part.h> | ||
| − | #include < | + | #include <kparts/factory.h> |
| − | #include | + | #include <QTreeWidget> |
| − | + | /** | |
| + | * This is a "Part". It that does all the real work in a KPart | ||
| + | * application. | ||
| + | */ | ||
| + | class helloPart : public KParts::ReadWritePart | ||
{ | { | ||
| − | + | Q_OBJECT | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | private: | |
| + | QTreeWidget *mMainWidget; | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
public: | public: | ||
| − | + | helloPart(QWidget *parentWidget, QObject *parent, const QVariantList&); | |
| − | + | ||
| − | + | QTreeWidget* MainWidget() { return mMainWidget; }; | |
| − | { | + | |
| − | + | virtual ~helloPart(); | |
| − | + | bool openFile(){}; | |
| − | + | bool saveFile(){}; | |
| − | + | ||
}; | }; | ||
| + | |||
| + | #endif // _HELLOPART_H_ | ||
</code> | </code> | ||
| − | == | + | == hello_part.cpp == |
<code cpp> | <code cpp> | ||
| − | + | #include "hello_part.h" | |
| − | + | ||
| − | #include " | + | |
| − | + | #include <kdemacros.h> | |
| + | #include <kparts/genericfactory.h> | ||
| + | |||
| + | K_PLUGIN_FACTORY(helloPartFactory, registerPlugin<helloPart>();) // produce a factory | ||
| + | K_EXPORT_PLUGIN(helloPartFactory("hello","hello") ) | ||
| + | |||
| + | helloPart::helloPart( QWidget *parentWidget, QObject *parent, const QVariantList& ) | ||
| + | : KParts::ReadWritePart(parent) | ||
{ | { | ||
| − | + | KGlobal::locale()->insertCatalog("hello"); | |
| − | + | // we need an instance | |
| − | new | + | setComponentData( helloPartFactory::componentData() ); |
| − | setWidget( | + | |
| + | mMainWidget = new QTreeWidget( parentWidget ); | ||
| + | setWidget( mMainWidget ); | ||
} | } | ||
| − | + | helloPart::~helloPart() | |
| − | + | ||
{ | { | ||
| − | |||
| − | |||
| − | |||
} | } | ||
| + | |||
| + | #include "hello_part.moc" | ||
</code> | </code> | ||
= Compiling your KPart = | = Compiling your KPart = | ||
| − | To compile | + | To compile and link the code above, use |
| − | cmake . && make | + | cmake . && make |
= Using your KPart = | = Using your KPart = | ||
Contents |
Kontact is a KDE PIM (personal information management) framework that allows embedding several pim applications like kmail and korganizer as plugins into one window. Kontact plugins are KParts that get loaded at runtime. So, this is a good time to learn how to write a kPart... Read on.
We will write a "hello world"-KPart here. And we will write a MainWindow to hold this KPart. A KPart also gives you the flexibility to be integrated into kontact or konqueror, but we will do this later. So, the "hello world"-KPart only consists of a pushbutton labeled "hello world". We chose a pushbutton because it is the easiest viewable thing to create. It does not trigger an action on your click. The following is what you do
We will use 4 files to do this:
project(hello)
find_package (KDE4 REQUIRED)
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} . )
include_directories( ${KDE4_INCLUDE_DIR}/kcal ${CMAKE_SOURCE_DIR}/kresources/remote )
########### next target ###############
set(hello_shared_SRCS
hello_part.cpp
)
set(hellopart_PART_SRCS hello_part.cpp)
kde4_add_plugin(hellopart ${hellopart_PART_SRCS})
target_link_libraries(hellopart ${KDE4_KPARTS_LIBS} ${KDE4_KCAL_LIBS} ${KDE4_KIO_LIBS} kdepim kcal_resourceremote)
if(X11_Xscreensaver_LIB)
target_link_libraries(hellopart ${X11_Xscreensaver_LIB} )
endif(X11_Xscreensaver_LIB)
install(TARGETS hellopart DESTINATION ${PLUGIN_INSTALL_DIR})
########### install files ###############
install( FILES hello_part.desktop DESTINATION ${SERVICES_INSTALL_DIR})
/**
* This is a "Part". It that does all the real work in a KPart * application. */
class helloPart : public KParts::ReadWritePart {
Q_OBJECT
private: QTreeWidget *mMainWidget;
public:
helloPart(QWidget *parentWidget, QObject *parent, const QVariantList&);
QTreeWidget* MainWidget() { return mMainWidget; };
virtual ~helloPart();
bool openFile(){};
bool saveFile(){};
};
K_PLUGIN_FACTORY(helloPartFactory, registerPlugin<helloPart>();) // produce a factory K_EXPORT_PLUGIN(helloPartFactory("hello","hello") )
helloPart::helloPart( QWidget *parentWidget, QObject *parent, const QVariantList& )
: KParts::ReadWritePart(parent)
{
KGlobal::locale()->insertCatalog("hello");
// we need an instance
setComponentData( helloPartFactory::componentData() );
mMainWidget = new QTreeWidget( parentWidget ); setWidget( mMainWidget );
}
helloPart::~helloPart() { }
To compile and link the code above, use
cmake . && make
To use your KPart, we need an object file, ending in .so. So, let's modify CMakeLists.txt a bit:
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})
set(kdepartplugin_PART_SRCS ${kdepartSources})
kde4_add_plugin(kdepartplugin ${kdepartSources})
target_link_libraries(kdepartplugin ${KDE4_KDEUI_LIBS}
${KDE4_KPARTS_LIBS} )
You can use konqueror to display your kpart: konqueror -> Settings -> Configure Konqueror -> Web browsing -> Plugins
To integrate your KPart into kontact, you will need to have a .desktop file. This can be e.g. here:
$ 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
You will also need your plugin, maybe here:
$ find /home/kde-devel/kde/lib/ -iname "karmpart*" /home/kde-devel/kde/lib/kde4/karmpart.so
You will also need to make your KPart a subclass of Kontact::Plugin