ich habe folgende Frage: Ich möchte meine Anwendung durch Plugins erweiterbar machen. Das hab ich auch schon geschafft, indem ich mich an dem QT-Example Plug and Paint orientiert habe.
Dazu habe ich eine Interfaceklasse (DSGPluginInterface) s.u., die von meiner Hauptklasse im Plugin-Project vererbt wird. Das Interface erbt von keiner anderen Klasse (wie im Plug and Paint auch). Das funktioniert alles soweit einwandfrei.
Nun möchte ich aber, dass die Plugins signals aussenden können, die ich in meiner Anwendung mit Funktionen verknüpfen kann. Das geht nach momentanem Stand nicht. Wie muss ich da vorgehen? Ich habe schon das Interface von QObject erben lassen, um Signals im Interface zu definieren. Dann kann ich aber meine Plugin-Klasse nicht mehr von QObject erben lassen und es kommt dort zu "undefined references", weil er z.B. das Macro Q_EXPORT_PLUGIN2 nicht mehr findet. Habt ihr da eine Idee? Das wär spitze. Hier noch eine Skizze der beiden Klassen, so wie sie momentan angelegt sind (ohne Signals):
Interface:
Code: Alles auswählen
#ifndef DSGPLUGININTERFACE_H
#define DSGPLUGININTERFACE_H
#include <QString>
#include <dsimage.h>
class DSGPluginInterface
{
public:
virtual ~DSGPluginInterface() { delete outputImage; }
virtual QString getPluginName() = 0;
virtual void createDialogUI() = 0;
virtual void createWidgetUI() {}
virtual bool start() = 0;
virtual dynaSAUR::DSImage * getOutputImage() { return this->outputImage; }
virtual QString getLastError() { return this->lastError; }
virtual bool supportsWidgetUI() { return false; }
protected:
dynaSAUR::DSImage * inputImage;
dynaSAUR::DSImage * outputImage;
QString lastError;
virtual void makeError(const QString &st) { this->lastError = st; }
};
Q_DECLARE_INTERFACE(DSGPluginInterface, "com.DSGExplorer2.Plugin.Interface/1.0")
#endif // DSGPLUGININTERFACE_H
Code: Alles auswählen
#ifndef TESTPLUGIN_H
#define TESTPLUGIN_H
#include <QObject>
#include <QString>
#include <QtPlugin>
#include "dsgplugininterface.h"
class TestPlugin : public QObject, public DSGPluginInterface
{
Q_OBJECT
Q_INTERFACES(DSGPluginInterface)
public:
QString getPluginName();
void createDialogUI();
void createWidgetUI();
bool start();
virtual bool supportsWidgetUI() { return true; }
};
#endif // TESTPLUGIN_H
-Sebastian