Ort der Lib abfragen, Designfragen

Alles rund um die Programmierung mit Qt
Antworten
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Ort der Lib abfragen, Designfragen

Beitrag 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!
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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();
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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!!
Antworten