Étude de l'utilisation des Signaux et Slots dans le plugin¶
Objectif:- le simple ajout du plugin dans le répertoire plugins/ de l'application lui ajoute la capacité à travailler avec un serveur de logs et paramétrages
- 1. faire directement des appels à des fonctions du plugin
- 2. utiliser les signaux et slots
Le problème du 1) c'est qu'il faut instancier l'objet "plugin" dans chaque classe où on en aurait besoin, ça demande donc une modification trop profonde du code pour que ça soit acceptable.
Le 2) est une solution plus élégante que nous avons mise en place le 08.10.2010 dans calcul-mental ... mais demande à ce que chaque objet soit connecté aux signaux/slots de son parent jusqu'à être "remonté" jusqu'au plugin ... ça demande donc aux développeurs de prévoir ça en amont.
Solution rêvée ou idéale
Dans l'idéal nous aimerions que chaque objet puisse se connecter sur des slots et émettre des signaux sur un "bus global" à toute l'application. Par exemple que n'importe quel objet puisse émettre un signal "Envoyer le log suivant: blablablablabla" et que ce signal soit capté par le plugin qui le traite et l'expédie au serveur.
QT propose de faire des connexions signaux/slots automatique pour peu qu'on respecte une certaine nomenclature mais je n'arrive pas à trouver le "truc" pour pouvoir la mettre en oeuvre dans notre cas particulier.
Notes et références:- http://www.siteduzero.com/forum-83-567089-p1-qtplugin.html
- http://stackoverflow.com/questions/2557375/what-is-the-correct-qt-idiom-for-exposing-signals-slots-of-contained-widgets
- http://stackoverflow.com/questions/844623/qt-signals-inheritance-question
- http://stackoverflow.com/questions/2086142/qt-signaling-across-threads-one-is-gui-thread
- http://stackoverflow.com/questions/3222307/qt-signals-slots-in-a-plugin
- http://stackoverflow.com/questions/1565654/qt-map-signals-based-on-parameter-value
Solution: les évènements¶
La solution est arrivée tardivement mais juste avant la réunion des développeurs du Terrier: les event sont globaux à l'application. L'application créé un event, le plugin le capte et se connecte sur une interface publique de l'application. Tout simplement. Ceci a donné naissance à une classe abuleduexercicev0 et à la disparition de l'interface du plugin qui n'en a plus besoin vu que c'est lui qui se connecte sur l'interface de l'application.