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:
Ainsi, je connecte mon application au signal de l'instance du plugin lors de son initialisation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); };
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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; };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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; };
Dans l application, cela donnerait quelque chose comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 AppBridge *applicationSide = new AppBridge(app); myPlugin->initialize(applicationSide);
Merci pour vos avis sur le sujet.
Cordialement,
Partager