Hallo!
Ich habe ein kleines Problem mit einem selbstgeschriebenen QT-Plugin. Dieses Plugin wird von einer Anwendung geladen und soll einen QDialog anzeigen.
Das Interface ist folgendermaßen deklariert:
class MyInterface
{
public:
virtual ~MyInterface() {};
virtual QDialog *createDialog()=0;
};
Q_DECLARE_INTERFACE(MyInterface,"myInterface/1.0");
Die Deklaration des Plugins sieht folgendermaßen aus:
class MyPlugin : public QObject, public MyInterface
{
Q_OBJECT
Q_INTERFACES(MyInterface);
public:
QDialog *createDialog();
[...]
};
Die Funktion createDialog sieht so aus:
QDialog* MyPlugin::createDialog()
{
QDialog *myDialog=new QDialog();
initDialog(myDialog); //hier werden die GUI Elemente eingefügt
return myDialog;
}
Q_EXPORT_PLUGIN(diwarunPlugin)
Und so wird das Plugin geladen:
QObject *plugin = loader.instance();
if (plugin)
{
MyInterface *plugin_dialog = qobject_cast<MyInterface *>(plugin);
if (plugin_dialog)
{
QDialog *dialog=plugin_dialog->createDialog();
dialog->exec();
}
}
Das Plugin wird korrekt geladen und auch das Dialogfenster angezeigt. Mein Problem besteht darin, dass das Dialogfenster nach dem Schließen ein zweites Mal angezeigt wird und ich keinen Schimmer habe, warum der Dialog zweimal angezeigt wird.
Ein weiteres Problem tritt auf, wenn ich statt QDialog ein eigenes, von QWidget abeleitetes Objekt verwende. Dann tritt beim Laden des Plugins ein Segmentation Fault auf.
Vielen Dank für Eure HIlfe.
Gruß Michael
QT4(.0.1) - Plugins
Moin!
Ich habe selbst eine Lösung für beide geschilderten Probleme gefunden. Ich habe dazu die Plugin-Klasse ein wenig erweitert:
class MyPlugin : public QDialog, public MyInterface,private UI::meinDialog
{
Q_OBJECT
Q_INTERFACES(myInterface);
public:
void createDialog();
[...]
};
Die Funktion createDialog sieht nun so aus:
void MyPlugin::createDialog()
{
setupUI(this);
show();
[...]
}
Wird nun nach dem Laden des Plugins die Funktion createDialog aufgerufen, wird das Dialogfenster einwandfrei angezeigt.
Gruß Michael
Ich habe selbst eine Lösung für beide geschilderten Probleme gefunden. Ich habe dazu die Plugin-Klasse ein wenig erweitert:
class MyPlugin : public QDialog, public MyInterface,private UI::meinDialog
{
Q_OBJECT
Q_INTERFACES(myInterface);
public:
void createDialog();
[...]
};
Die Funktion createDialog sieht nun so aus:
void MyPlugin::createDialog()
{
setupUI(this);
show();
[...]
}
Wird nun nach dem Laden des Plugins die Funktion createDialog aufgerufen, wird das Dialogfenster einwandfrei angezeigt.
Gruß Michael