PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : KParts ???



TheDodger
01-06-2002, 14:24
Moin!

Sagt mal, hat sich jemand von euch schon mal intensiver mit KParts auseinander gesetzt?
Ich möchte gern jenes für meine Projekte benutzen und habe keine Ahnung, auf was ich mich da einlasse! ;)
Den Dokus zufolge scheint es leicht zu implementieren zu sein, doch ich finde immer nur etwas von den zu erstellenden shared objekten und nicht's vom eigentlichen Programm, welches diese einbindet :(

anda_skoa
01-06-2002, 15:23
David Faure hat gerade wieder einen Artikel zu KParts für IBm DeveloperWorks geschrieben:
http://dot.kde.org/1022212292/

Du kannst einen KPart auf zwei Arten benutzen.
Normal als Klasse aus eine Lib, alsi Linken zur Compilezeit. oder mittels Laden zu Laufzeit, wie das ZB Konqueror macht.

Zweiteres geht so:


#include <klibloader.h>
#include <ktrader.h>
#include <kservice.h>

KTrader::OfferList offers = KTrader::self()->query("ServiceName");
if (offers.count() == 0) // nix gefunden
return;

KService::Ptr servicePointer = offers.first(); // nehme den erstbesten Service
KLibFactory* factory = KLibLoader::self()->factory(servicePointer->library);
if (factory == 0)
return;

KParts::Part* part = factory->createPart(...); // Parameter siehe Doku


Der Trader findet alle Services für einen bestimmten ServiceType.
Ich hab in dem Beispiel einfach den ersten genommen.

Ciao,
_

EDIT: hab gerade diese Seite auf developer.kde.org entdeckt:
http://developer.kde.org/documentation/kde3arch/services.html

In meinem Codebeispiel oben ist ein kleiner Fehler.
Factory muß zuerst auf KParts::Factory gecasted werden, bevor man createPart benutzen kann :rolleyes:

TheDodger
03-06-2002, 05:39
Danke!

nun, ich will kein Plugin für eine bestehende App entwickeln, sondern meiner App Plugins beibringen.
Allerdings eher in der Art des KControl-Centers ...
Meine App 'scannt' ein entspr. Verzeichnis und prüft, ob die darinliegenden shared libs als plugins genutzt werden können. Wenn ja, werden sie entsprechend eingebunden ... sprich das Icon wird in ein QIconListview geladen und die Funktionen stehen zur Verfügung.

Was ich bis jetzt gefunden habe, sind diverse 'Tutorials' Plugins zu erstellen ... machmal sogar mit Source Code. Aber noch nie ein Tutorial, wie ich diese Plugins nutzen kann ... quasi ein Plugin-Loader. Oder wie ich die Funktionen der Plugins aufrufen kann ... :(

Argl ... ist nicht schön, oder ich bin zu blöd, google zu benutzen ...

anda_skoa
03-06-2002, 10:04
Original geschrieben von TheDodger
Danke!

nun, ich will kein Plugin für eine bestehende App entwickeln, sondern meiner App Plugins beibringen.
Allerdings eher in der Art des KControl-Centers ...
Meine App 'scannt' ein entspr. Verzeichnis und prüft, ob die darinliegenden shared libs als plugins genutzt werden können. Wenn ja, werden sie entsprechend eingebunden ... sprich das Icon wird in ein QIconListview geladen und die Funktionen stehen zur Verfügung.


Wenn die Plugins KParts::Part oder KParts::Plugin sind, dann brauchst du nicht selbst zu scannen.
Dafür gibt es KTrader.

Der liefert dir eine Liste von Services, die einen entsprechenden ServiceType implementieren.
Jeder Eintrag in der Liste ist eine KService::Ptr, ein shared pointer auf ei KService Objekt.

Das kannst du dann befragen und Name, Icon, Beschreibung, etc. herausfinden.

Unter anderem kennt die KService Instanz auch die Library, in der dieser Service implementiert ist.
Ich kopier hier nochmal meinem Beispielcode:



#include <klibloader.h>
#include <ktrader.h>
#include <kservice.h>

KTrader::OfferList offers = KTrader::self()->query("ServiceName");
if (offers.count() == 0) // nix gefunden
return;

KService::Ptr servicePointer = offers.first(); // nehme den erstbesten Service
KLibFactory* factory = KLibLoader::self()->factory(servicePointer->library);
if (factory == 0)
return;

// Wenn es ein KParts ist, kann man die Factory auf KParts::Factory casten
// Wenn es ein eigener Plugintyp ist, hat er wahrscheinlich sogar eine
// eigene Factory
KMyPluginFactory* myFac = (KMyPluginFactory*) factory;

// ich nehme jetzt einfach an, diese KMyPluginFacory habe eine Methode
// createPlugin(QObject* parent=0, const char* name= 0);

KMyPlugin* myPlugin = createPlugin(parent);


Das Plugin myPlugin kannst du so benutzen, wie wenn es mit new KMyPlugin erzeugt worden wäre.

Doku zu KTrader, KService sind im kio Teil der KDE Doku, KlibLoader und KLibFactory in kdecore, KParts::Factory, KParts::Part und KParts::Plugin in kparts.

Wenn du mehr Beispielcode brauchts, findest du vielleicht brauchenbaren im Kmud2 Snapshot (www.kmud.de)
Plugins werden in parts/mapper/cmapmanager.cpp::initPlugins() und spezielle KParts (KmudPart) werden in kmud/kmudcore.cpp::loadPart geladen.

Ciao,
_

TheDodger
03-06-2002, 11:57
Original geschrieben von TheDodger
Danke!

nun, ich will kein Plugin für eine bestehende App entwickeln, sondern meiner App Plugins beibringen.
[...]
Argl ... ist nicht schön, oder ich bin zu blöd, google zu benutzen ...

ich bin anscheinend doch zu blöd zum suchen :mad: ... ich hab noch was gefunden, allerdings liegt das zu Hause auf'm Notebook, sonst könnt ich hier noch ein paar Links zum besten geben. Ich reiche die aber nach, versprochen ;)

Ansonsten ... jetzt muß ich halt nur den Kram noch entsprechend umsetzten.
und irgendwie graut mir davor :D

TheDodger
04-06-2002, 06:14
Original geschrieben von anda_skoa


Wenn die Plugins KParts::Part oder KParts::Plugin sind, dann brauchst du nicht selbst zu scannen.
Dafür gibt es KTrader.

Wie ich schon schrieb ... ich war wohl etwas drömelig in der Birne ... kommt mal vor :)

Ich habe mir aus disesem Artikel hier (http://phil.freehackes.org/kde/kpart-techno/de_kpart-techno.html) die Codes rausgeholt und soweit angepasst, das ich sie kompilieren kann (dein Beispiel kommt auch noch gleich an die Reihe :D )
Das einzige Problem habe ich beim linken:


obj/jargo.o: In function `Jargo::test(void)':
/home/bodo/src/phprojekt/jargo/jargo.cpp:206: undefined reference to `KTrader::self(void)'
/home/bodo/src/phprojekt/jargo/jargo.cpp:222: undefined reference to `KService::library(void) const'
collect2: ld returned 1 exit status
make: *** [jargo] Error 1


... hat sich gerade geklärt ... mann sollte dann auch bitte schön die libkio dazu linken ;)

hmmm, jetzt hab ich ein testplugin geladen und das klebt mir links oben in der ecke ... kann ich dem Plugin nicht sagen, welches Widget als parent genutzt werden soll?

Naja, bis hierher gings ja schon ... den Rest krieg ich auch noch hin :)

anda_skoa
04-06-2002, 08:43
Original geschrieben von TheDodger
hmmm, jetzt hab ich ein testplugin geladen und das klebt mir links oben in der ecke ... kann ich dem Plugin nicht sagen, welches Widget als parent genutzt werden soll?

Naja, bis hierher gings ja schon ... den Rest krieg ich auch noch hin :)

:)
Ist es ein KPart oder ein KParts::Plugin?

Ein KParts::Plugin hat ja nicht notwendigerweise ein Widget, darum gibt es auch kein Paretnwidget im Standardkontruktor.
Aber wenn diese spezielle Pluginklasse ein Widget hat, wird es in ihrem Interface schon die Mögklichkeit zum Setzen für ein Parentwidget geben.

Sind das eigene Plugins, oder fremde?

Bei eigene, wie sieht der Header deiner Factory aus, wie der Header der Pluginklasse.

Ciao,
_