Seite 1 von 1

Ort der Lib abfragen, Designfragen

Verfasst: 17. September 2009 11:14
von AuE
Hi,

ich habe fiolgende 2 Probleme:

1)
Ich habe eine Anwendung und mehrere Plugins getippt. Jedes Plugin hat eigene Übersetzungsdateien. Diese muss ich ja via qApp->installTranslator(...) installieren. Allerdings weiß ich grade nicht wie ich im Plugin an den Speicher Ort des Plugs rankomme (Ich will die Übersetzungen neben jedes plugin in einen Ordner speichern)

Ordnerstruktur:
+PluginLoader
-translations
+PlugA
-translations

Was ich brauche ist der Pfad zur PlugA.so

2) Problem Klassen und abgeleitetete Klassen

Ich konnte es bisher noch nicht gescheit lösen, das ich das Laden nur einmal implementiere....
Ich habe mir ein Interface geschrieben, das alle Plugins Implementieren müssen(rein virtuell).
Diese Klasse (Class MainInterface) ist nicht von QObject abgeleitet (hat also auch nicht das Makro). Das würde ich aber benötigen wenn ich in der Klasse das Laden der Sprachdateien machen würde.
Allerdings gibts dann einen Konflikt.

Wenn MainInterface:public QObject
{ Q_OBJECT ...};
mache dann sagt mir der Kompiler das das dann doppeldeutig ist (klar ist ja auch logisch - jedes Plugin ist ja ein Widget was auch QObject ist (und muss ja die MainInterface implementieren

Wie kann man das geschickter lösen?


Gruß und dank vorab!

Verfasst: 17. September 2009 12:45
von AuE
Mein aktueller Ansatz bzgl der Signal Slots:

Code: Alles auswählen

class ContolCenterMain;

class dummy : public QObject
{
	Q_OBJECT
	public :
			dummy(){}
	public  slots:
	void on_languagChange(const QString &){qDebug() <<"Dummyclass called";}
};


class AV_Plugin_Interface
{	
	friend class ContolCenterMain;
  public:
    virtual ~AV_Plugin_Interface() {}
    virtual QWidget *createWidget(QWidget *parent) = 0; // must implement
    virtual QString getName()  = 0; // must implement
    virtual QIcon getIconForWdg() = 0; // must implement
    virtual QMenu *getMenuSystemTray() = 0;// must implement
    virtual QMenu *getMenuMenuBar() = 0;// must implement

    // IMPLEMENT THE FOLLOWING AS PUBLIC SLOTS IN THE CLASS!!!!!


    protected:
    dummy phelper;
   };
Das connecten:

Code: Alles auswählen

 QPluginLoader loader(path.absoluteFilePath(pname), this);
		  QObject *plugin = loader.instance();
  AV_Plugin_Interface *plug = qobject_cast<AV_Plugin_Interface*>(plugin);
			  connect(this, SIGNAL(languageChanged(QString)), &plug->phelper, SLOT(on_languagChange(QString)));
Das connecten klappt auch... nur er raucht mir beim laufen ab!

Und zwar hier:
qobject.cpp [Zeile 2481]
const QMetaObject *rmeta = receiver->metaObject();

Verfasst: 17. September 2009 14:54
von AuE
man sollte schon überprüfen ob der cast klappt ;-)

hatte ein Plugin was nicht vom Interface abgeleitet ist.... naja das schiesst einen gut was weg!!