Anzeige:
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 15 von 55

Thema: Tutorial zu KParts?

  1. #1
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615

    Tutorial zu KParts?

    Gibt es sowas?

    Ich habe zwar eines (KDE2 Programmierung), doch die hören genau da auf, wo es interessant wird und die Beispiele lassen sich z.T. nicht mal kompilieren ... was zeimlich frustrierend ist, wenn man die alle abtippt, weil die nicht mit auf der CD sind ...

    Ich will jetzt endlich KParts verstehen! (und nutzen)
    Bodo
    Systemadmistration UNIX

  2. #2
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Also ich geb ja nicht auch ...

    Ich habe jetzt ein Bespiel gefunden ( hier z.B. ) welches ich benuzen möchte ...

    Source abgetippt (weil ich z.Z. nur unter Windoof auf'm Notebook surfen kann) und kopiliert ... nach versucht.
    Klappt soweit auch alles wunderbar, doch hieran stößt sich der Compilier:

    Code:
    extern "C" {
    
        void *init_libjargo() {
    
            return new JargoFactory;
        }
    };
    Da bekomme ich dann diese Meldung:
    Code:
    cannot allocate on object of type 'JargoFactory'
      because the following virtual functions are
      abstract:
    /usr/kde/3.1/include/klibloader.h:329: virtual QObject*
      KLibFactory::createObject( .... )
    (sorry, wenn ich nicht alles abtippe )

    Kann mir jemand sagen, was daran falsch ist?
    Bodo
    Systemadmistration UNIX

  3. #3
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Ich habe jetzt das virtual QObject* createObject() mit in meine Klasse aufgenommen und siehe da ... gcc hält die Fresse

    Ist aber schon seltsam ...
    Bodo
    Systemadmistration UNIX

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von TheDodger
    Ich habe jetzt das virtual QObject* createObject() mit in meine Klasse aufgenommen und siehe da ... gcc hält die Fresse

    Ist aber schon seltsam ...
    Naja, so seltsam ist das nicht
    Die Basis Factory ist eben eine abstrakte Klasse und diese Methode ist pure Virtual.
    Und von einer abstrakten Klasse kann man nun mal keine Instanz erstellen

    Das hier ist ein ziemlich aktuelles Tutorial von DAvid Faure:
    http://www-106.ibm.com/developerworks/library/l-kparts/

    Und noch zwei neuere
    http://www-105.ibm.com/developerwork...F?OpenDocument
    http://www-105.ibm.com/developerwork...1?OpenDocument
    die behandlen auch die neuen Factory Macros, die bei KDE3 eingeführt wurden.
    Man muß sich dazu bei IBM DeveloperWorks registrieren.

    Davids Tutorials sind aber weltklasse.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Hmmm ... ich weiß, daß ich bei IBM schon angemeldet bin ... seltsamerweise funktioniert von hier die Anmeldung nicht

    BTW. ich bin wieder Online!
    (nachdem mir die Teledumm innerhalb von 4 Tagen mein DSL gekappt hat ... und die NCom 4 Wochen gebraucht hatte, um mich wieder an's Netz zu bringen)
    Bodo
    Systemadmistration UNIX

  6. #6
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Ich habe mir jetzt eine eigene Factory zusammengebastelt und diese mit in mein Projekt kompiliert.
    Soweit war das ja witzig und einfach ... jetzt hab ich aber 'n schwarzes Loch im Kopf ... ich weiß nicht weiter
    Muß wohl an der Uhrzeit liegen ...
    Bodo
    Systemadmistration UNIX

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Die Factory kommt in die Lib deines Kparts, aber vielleicht ist das eh das, weas du gemeint hast

    Ist dein Part ein spezieller Part, eine eigene Subklasse von KParts::Part oder ein ReadOnly bzw ReadWrite Part und eine Subklasse davon?

    Im zweiten Fall ist der ServiceTyp schon festgelegt

    Allgemein braucht man einen ServiceType, der durch ein .desltop File in $KDEDIRS/share/servicetypes beschrieben wird.
    Jeder Part, der so ein Service implementiert, installiert zusammen mit der lib ein Serivce .desktop, das angibt, welche Services der Part kann.

    Das bzw. die benutzenden Programme, benutzen dann KTrader, um eine Listen von Service zu erhalten, die eine bestimmte Query erfüllen (meist ein ServiceType und eventuell noch ein MIME type)

    Wenns dazu Fragen gibt, kann ich ein Beispiel posten

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Original geschrieben von anda_skoa
    Die Factory kommt in die Lib deines Kparts, aber vielleicht ist das eh das, weas du gemeint hast
    eher nein, ich hab die factory in das Programm einkompiliert

    Ist dein Part ein spezieller Part, eine eigene Subklasse von KParts::Part oder ein ReadOnly bzw ReadWrite Part und eine Subklasse davon?
    im moment (zum testen eine subklasse von ReadWritePart.
    Allerdings weis ich nicht, ob das richtig ist.
    Meine Parts sollten eigentlich nur von meinem Programm aus sinnvoll genutzt werden können. Wäre es nicht besser, eine Subklasse von KParts::Part abzuleiten?

    Wenns dazu Fragen gibt, kann ich ein Beispiel posten
    gerne doch
    Bodo
    Systemadmistration UNIX

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von TheDodger
    eher nein, ich hab die factory in das Programm einkompiliert

    Ok, aber sie gehört in die Lib.
    Das ist nämlich das Symbol, das mit dlsym in der Lib gesucht wird.
    Darum auch in extern "C" Klammern.


    im moment (zum testen eine subklasse von ReadWritePart.
    Allerdings weis ich nicht, ob das richtig ist.
    Meine Parts sollten eigentlich nur von meinem Programm aus sinnvoll genutzt werden können. Wäre es nicht besser, eine Subklasse von KParts::Part abzuleiten?
    ReadWrite Part oder ReadOnly Part machen nur Sinn, wenn der Part mit einem Document arbeitet, das auf einer URL basiert, also zB im Konqueror als eingebetteter Viewer dienen kann.

    Wenn es mehr ein spezielles Plugin für eine Applikation ist, leitet man am besten eine eigene Part Basisklasse ab.

    Hat den Vorteil, dass man alle Methoden selber festlegen kann, etc.

    Das Beispiel poste ich später, hab gerade nicht so viel Zeit.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Das versprochene Beispiel

    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Danke!

    Ich werd's testen, sobald ich wieder etwas Lust habe und es mir etwas besser geht.
    Einwas verstehe ich allerdings in deinem Beispiel nicht ganz ...

    und zwar ist die myAPI Klasse ...

    Versteh ich das so richtig, das in der myAPI Klasse die ganzen Definitionen wi open() close(), save() etc. definiert werden und ich mittels virtula vois setAPI( myAPI* ) quasi diese Definitionen in meine Part Klasse 'hinzulade' und ich dies dort nicht auch komplett angeben muß?

    Oder liege ich falsch?
    Bodo
    Systemadmistration UNIX

  12. #12
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Die MyAPI Klasse brauchst du nicht unbedingt.
    Nur, wenn die Applikation den Parts ein Interface bieten will, das sie benutzen können.

    Man kann auch einfach nur mit SIGNAL/SLOT arbeiten, dann muß der Part nix wissen, sondern emittet nur ein signal.
    In diesem Fall connectet die Applikation die Sache so wie sie will.
    Ist weniger stark gebunden.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  13. #13
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Mal abgesehen davon ...
    Wo kommen eigentlich die ServiceType Dateien hin?
    Und die erzeugten (Part)libs?

    Mittlwerweile kompiliert das soweit ohne Fehler ... er zeigt mir auch via
    Code:
    qDebug( " ------------------------- " );
    for( ; it != offers.end() ; ++it ) {
    
          KService::Ptr ptr = (*it);
    
          qDebug( ptr->name().latin1() );
    }
    qDebug( " ------------------------- " );
    Denn einzigen gefunden Part an, aber ich glaube, das hier läuft nicht so wie es soll:

    factory = loader->factory( offers[i]->library() );

    denn die nachfolgende if() Schleife wird nicht weiter genutzt ...
    Geändert von TheDodger (17-10-2002 um 12:48 Uhr)
    Bodo
    Systemadmistration UNIX

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von TheDodger
    Mal abgesehen davon ...
    Wo kommen eigentlich die ServiceType Dateien hin?
    im Makefile.am sieht das so aus
    Code:
    servicetypedir = $(kde_servicetypesdir)
    servicetype_DATA = myservicetype.desktop
    der Part
    Code:
    servicedir = $(kde_servicesdir)
    service_DATA = mypart.desktop

    Und die erzeugten (Part)libs?
    Wieder im Makefile.am
    Code:
    kde_module_LTLIBRARIES = libmypart.la
    libmypart_la_LDFLAGS = $(all_libraries) -version-info 1:0 $(KDE_PLUGIN)
    libmypart_la_LIBADD = eventuelle_teil_libs.la $(LIB_KPARTS)

    Denn einzigen gefunden Part an, aber ich glaube, das hier läuft nicht so wie es soll:

    factory = loader->factory( offers[i]->library() );

    denn die nachfolgende if() Schleife wird nicht weiter genutzt ...
    Was sagt er, wenn du aus der Konsole startest und die Debug Areas für Trader und LibLoader aktiviert hast?
    (kdebugdialog)

    Vielleicht kann das factory symbol nicht gefunden werden oder sie ist keine KLibFactory bzw. Subklasse davon.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer Avatar von TheDodger
    Registriert seit
    18.05.2001
    Ort
    Hamburg
    Beiträge
    615
    Original geschrieben von anda_skoa
    im Makefile.am sieht das so aus
    [...]
    ich nutze kein KDevelop, oder automake ich erstelle meine Makefiles via qmake.
    Ich habe aber gestern abend noch rausgefunden, was wohin gehört:

    $(KDEDIR)/share/services/
    $(KDEDIR)/share/servicetypes/


    Wieder im Makefile.am
    grummel

    Naja, dann such ich halt.
    wie sieht's mit $(KDEDIR)/lib aus ?


    Was sagt er, wenn du aus der Konsole startest und die Debug Areas für Trader und LibLoader aktiviert hast?
    (kdebugdialog)
    Hab ich noch nie mit gearbeitet ...


    Vielleicht kann das factory symbol nicht gefunden werden oder sie ist keine KLibFactory bzw. Subklasse davon.
    gut möglich ...
    mit strace habe ich nicht mal gefunden, daß nach der lib gesucht wird ...
    Bodo
    Systemadmistration UNIX

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •