Plug-ins et échanges avec l'application
Bonjour,
J'aimerais effectuer des échanges bidirectionnels de données entre une application et ses plugins. Les plugins sont gérés par le système Qt avec PluginLoader. C'est typiquement le cas pour créer des plugins d'import ou d'export de donnés.
Auriez vous de bonnes pratiques sur le sujet?
Voici deux solutions que j ai envisagées; qu'en pensez vous de celles-ci sachant qu'il faut ensuite les adapter à l’échange bidirectionnel?
1/le système des SIGNALS/SLOTS pour récupérer des données d'un plugin:
Donc l interface pour les plugins comme ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class ImportInterface : public QObject
{
Q_OBJECT
public:
explicit ImportInterface() : QObject(0) {}
virtual bool getData(double *data) = 0;
signals:
void dataReady(int size);
}; |
Ainsi, je connecte mon application au signal de l'instance du plugin lors de son initialisation.
Lorsque le plugin émet le signal dataReady, l'application récupère les données via getData.
Par ce moyen, la logique n'est pas exposée. Seul le fichier header du plugin est nécessaire pour créé un nouveau plugin. Cette solution a ma préférence.
2/ J'ai lu l’idée de fournir une classe commune à l'application et au plugin; un espèce de bridge.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class ImportInterface : public QObject
{
Q_OBJECT
public:
explicit ImportInterface() : QObject(0) {}
virtual bool initialize(AppBridge *applicationBridge) = 0;
protected:
AppBridge *bridge;
}; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class AppBridge: public QObject
{
Q_OBJECT
public:
explicit AppBridge(QObject *parent) : QObject(parent) {}
void getData(double* data, int *size);
void setData(double* data, int size);
protected:
double *data;
int size;
}; |
Par ce biais, il est possible d'heriter AppBridge dans l'application et de recuperer les donnes via la variable qui est située dans la classe Mere AppBridge.
Dans l application, cela donnerait quelque chose comme ceci:
Code:
1 2
| AppBridge *applicationSide = new AppBridge(app);
myPlugin->initialize(applicationSide); |
Merci pour vos avis sur le sujet.
Cordialement,