Hi!
Ein kleines Beispiel zu KParts
das Interface der speziellen KParts der Beispiel App
Code:
class MyPart : public KPart::Part
{
Q_OBJECT
public:
MyPart(QObject* parent, const char* name);
~MyPart();
virtual void setAPI(MyAPI* api) = 0;
virtual void foorBar() = 0;
};
Das Interface, dass die Applikation den Parts gegenüber bietet
Code:
class MyAPI
{
public:
virtual QPtrList<MyPart> parts() = 0;
};
Der ServiceType, der mit der Applikation MyApp installiert wird
Code:
[Desktop Entry]
Type=ServiceType
X-KDE-ServiceType=MyApp/Part
Name=MyApp KParts
Ein Part
Code:
class MyPartImpl : public MyPart
{
Q_OBJECT
public:
MyPartImpl(QObject* parent, const char* name);
¨MyPartImpl(MyAPI* api);
void setAPI(MyAPI* api) {
m_api = api;
}
void fooBar() {
if (m_api == 0) return;
QPtrList<MyPart> parts = m_api->parts();
qDebug("Die Applikation hat gerade %d Parts geladen", parts.count());
}
protected:
MyAPI* m_api;
};
Der Part installiert dann mit seiner lib folgendes .desktop FIle
Code:
[Desktop Entry]
Type=Service
Comment=really useful part
Name=MyPart Example Implementation
ServiceTypes=MyApp/Part
X-KDE-Library=libmypartimpl
Hier ist wichtig, das Type=Service ist, dass ServiceTypes den Type enthält, den die Applikation erwartet und dass der Name der Lib korrekt ist (im "modules" Verzeichnis befindet sich dann die Lib libmypartimpl.la)
Die Applikation eght nun so vor
Code:
void MyApp::loadParts()
{
KTrader::OfferList offers;
KLibFactory* factory=0;
MyPart* part = 0;
// Query nach Services unseres ServiceTypes
KTrader::OfferList offers = KTrader::self()->query("MyApp/Part");
KLibLoader* loader = KLibLoader::self();
for (uint i = 0; i < offers.count(); ++i)
{
factory = loader->factory(offers[i]->library());
if (factory != 0 && factory->inherits("KParts::Factory"))
{
KParts::Factory* fac = static_cast<KParts::Factory*>(factory);
KParts::Part* p = fac->createPart(this, 0, this);
if (p != 0 && p->inherits("MyPart"))
{
part = static_cast<MyPart*>(p):
part->setAPI(this); // nehmen wir an MyApp implementiert MyAPI selbst
m_parts.append(part); // m_parts sei eine QPtrList<MyPart>
}
}
}
}
QPtrList<MyPart> MyApp::parts()
{
return m_parts;
}
void MyApp::callFooBar()
{
for (uint i = 0; i < m_part.count(); ++i)
{
m_parts.at(i)->fooBar();
}
}
Ein "Real World" Beispiel, das zusätzlich eine spezielle Factory Subklasse benutzt, ist Kmud2
www.kmud.de
Dort werden sowohl Parts, als auch KParts::PLugin verwendet.
Ciao,
_
Lesezeichen