Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Qt-Plugins: So richtig oder gehts einfacher?

  1. #1
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549

    Qt-Plugins: So richtig oder gehts einfacher?

    Da ich Infos nur bröckchenweise gefunden habe und ein entsprechender Thread auf mrunix.de nicht abrufbar ist hab ich mich mal an einem Test-Plugin-Progrämmchen versucht.

    interface.h
    Code:
    #ifndef INTERFACE_H
    #define INTERFACE_H
    class QString;
    
    class Interface {
    public:
            virtual QString* getText() = 0;
    };
    #endif
    Dann ein kleines Testplugin dazu:

    testplugin.h
    Code:
    #ifndef TESTPLUGIN_H
    #define TESTPLUGIN_H
    
    class QString;
    
    #include "interface.h"
    
    extern "C" {
            Interface*  getPlugin();
    }
    
    class TestPlugin : public Interface {
    public:
            virtual QString* getText();
    };
    #endif
    testplugin.cpp
    Code:
    #include "testplugin.h"
    
    #include <qstring.h>
    
    #include <iostream>
    
    Interface* getPlugin() {
            return new TestPlugin();
    }
    
    QString* TestPlugin::getText() {
            std::cout << "**** TestPlugin::getText() invoked" << std::endl;
            return new QString("**** QString - Returnvalue from Testplugin");
    }
    Und schliesslich das Programm

    main.cpp
    Code:
    #include "interface.h"
    
    #include <qlibrary.h>
    
    #include <qstring.h> //only as Return Value is QString
    #include <iostream> //only for testoutput
    
    typedef Interface* (*getPlugin)();
    
    int main(int argc, char *argv[]) {
            std::cout << "bla" << std::endl;
            QLibrary lib( "testplugin" );
            getPlugin pl = (getPlugin) lib.resolve("getPlugin");
            Interface* i = pl();
            QString* s = i->getText();
            std::cout << *s << std::endl;
    }
    Der Code funktioniert unter Linux (Debian mit Qt 3.3.2, gcc 3.3) und Windows (Qt 3.1.x, MinGW mit gcc 3.4)

    Muss ich das alles so kompliziert machen oder gehts auch ein bisschen einfacher?
    Am liebsten würde ich die extern "c"-Funktion eliminieren, so dass man für ein Plugin nur noch das Interface includen und die virtual-Methoden überladen muss.

    Download der Quellen inkl. QMake .pro-Datein

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Du kannst das extern "C" ja in den Header geben, in dem auch das Interface spezifiziert ist.

    Das musst du dann ohnehin inkludieren.

    Btw: eher QString statt QString* benutzen. QString ist intern geshared, man verliert also nicht allzuviel Performance durch das Erzeugen der neuen Instanz, aber ich finde man gewinnt Sicherheit, weil man als Aufrufer immer ganz sicher ein funktionierendes QString Objekt erhält und auch nicht in der Doku nachgeschlagen werden muss, wer nach Aufruf der Besitzer des Pointers ist (wer ihn löschen muss)

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Danke für die Tipps. Funktioniert prächtig soweit.

    Nein, nicht nur soweit. Ganz
    Die Frage die ich eben stellen wollte hat sich schon beantwortet (kaum guckt man mal die richtige Seite im Stroustroup an )

    Dann werde ich die Pluginnerei mal an einem Program austesten das so klein ist dass das tendentiell Irrsinn ist

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

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