[gelöst] Plugins, MetaObjectSystem u. Zugr. auf Q_CLASSINFO
Verfasst: 23. September 2007 12:45
Dieses Problem ist hier gelöst worden: http://qtforum.de/forum/viewtopic.php?p=25601#25601
--------------------------------------------------------------------------------
Hallo zusammen!
Mein Problem ist etwas kniffliger, deshalb beschreibe ich zuerst mal meine Überlegungen und welchen Weg man zur Lösung schon mal nicht einschlagen kann. Die eigentliche Frage ist unten fett markiert.
In einem aktuellen Projekt von mir benutze ich erfolgreich Plugins, um die Fähigkeiten meines Programms zu erweitern.
Plugins leiten sich ja bekanntlich von einer Klasse ab, die ausschließlich rein virtuelle Methoden enthält.
(Da mein Hauptprogramm, welches die Plugins zur Laufzeit läd, aber nur die Methoden kennt, welche in der Interface-Klasse des Plugins beschrieben sind, arbeite ich auch nur mit diesen Methoden.)
Die die Interface-Klasse implementierenden Plugin-Klassen leiten sich ja außerdem von QObject ab und besitzen somit die Fähigkeiten eines QMetaObjects.
Hier mal ein paar Code-Fragment von den wichtigsten Klassen:
Hier nun meine Frage(n):
Normalerweise ist ein Zugriff auf die Q_CLASSINFO der Plugin-Klasse ja wie folgt möglich.
Wie man sich aber denken kann, kenne ich die Klasse Plugin zur Kompilierzeit aber noch nicht, sondern nur das Interface (PluginInterface). Ein nahe liegende Möglichkeit zur Lösung des Problems bestünde also darin, einfach auf der Basis von PluginInterface zu arbeiten:
Dass das nicht geht, sehe ich ein, da sich die Klasse PluginInterface ja nicht von QObject ableitet und folglich auch nichts von QMetaObjects weiß.
Aber wie kann ich sonst auf die Q_CLASSINFO Einheiten der Klasse Plugin zugreifen, wenn ich die Klasse Plugin zur Kompilierzeit noch gar nicht kenne und mir nur das PluginInterface bekannt ist?
Vielen Dank für eure Aufmerksamkeit
kowi
--------------------------------------------------------------------------------
Hallo zusammen!
Mein Problem ist etwas kniffliger, deshalb beschreibe ich zuerst mal meine Überlegungen und welchen Weg man zur Lösung schon mal nicht einschlagen kann. Die eigentliche Frage ist unten fett markiert.
In einem aktuellen Projekt von mir benutze ich erfolgreich Plugins, um die Fähigkeiten meines Programms zu erweitern.
Plugins leiten sich ja bekanntlich von einer Klasse ab, die ausschließlich rein virtuelle Methoden enthält.
(Da mein Hauptprogramm, welches die Plugins zur Laufzeit läd, aber nur die Methoden kennt, welche in der Interface-Klasse des Plugins beschrieben sind, arbeite ich auch nur mit diesen Methoden.)
Die die Interface-Klasse implementierenden Plugin-Klassen leiten sich ja außerdem von QObject ab und besitzen somit die Fähigkeiten eines QMetaObjects.
Hier mal ein paar Code-Fragment von den wichtigsten Klassen:
Code: Alles auswählen
class PluginInterface
{
public:
PluginInterface {}
virtual void setup() = 0;
};
Q_DECLARE_INTERFACE(PluginInterface, "de.meineDomain.PluginInterface/1.0")Code: Alles auswählen
#include "PluginInterface.h"
#include <QObject>
class Plugin : public QObject, public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
Q_CLASSINFO("author", "kowi1134")
Q_CLASSINFO("url", "http://not.needed.com")
public:
void setup();
};Code: Alles auswählen
#include <QtPlugin>
#include "Plugin.h"
void Plugin::setup()
{
// ...
}
Q_EXPORT_PLUGIN2(plugin, Plugin)Normalerweise ist ein Zugriff auf die Q_CLASSINFO der Plugin-Klasse ja wie folgt möglich.
Code: Alles auswählen
Plugin * plugin = new Plugin;
const QMetaObject * metaObj = plugin->metaObj();
int authorIdx = metaObj->indexOfClassInfo("author");
QMetaClassInfo info = metaObj->classInfo(authorIdx);
cout << "Autor der Klasse Plugin: " << info.value();Code: Alles auswählen
QPluginLoader pluginLoader("plugin.dll");
QObject *obj = pluginLoader.instance();
PluginInterface * plugin = qobject_cast<PluginInterface *>(obj);
const QMetaObject * metaObj = plugin->metaObj();
int authorIdx = metaObj->indexOfClassInfo("author");
QMetaClassInfo info = metaObj->classInfo(authorIdx);
cout << "Autor der Klasse Plugin: " << info.value();Aber wie kann ich sonst auf die Q_CLASSINFO Einheiten der Klasse Plugin zugreifen, wenn ich die Klasse Plugin zur Kompilierzeit noch gar nicht kenne und mir nur das PluginInterface bekannt ist?
Vielen Dank für eure Aufmerksamkeit
kowi