@SGaist I think it will be easier if I provide a piece of code
I have 2 app: AppPlugin and MainApp
In these two app there is a class that stores global variables:
GlobalData.h
…
extern MainWindow *mainWindow;
extern QWidget *wgt;
extern QGraphicsScene *scene;
extern QGraphicsView *view;
extern QDeclarativeEngine *engine;
…
<<<<<<<<
GlobalData.cpp
…
MainWindow *mainWindow;
QWidget *wgt;
QGraphicsScene *scene;
QGraphicsView *view;
QDeclarativeEngine *engine;
…
<<<<<<<<
AppPlugin:
int main(…)
{
QApplication a(argc, argv);
mainWindow = new MainWindow;
return a.exec()(
}
<<<<
MainWindow.h
class MainWindow : public QObject
{
MainWindow(QObject * parent = 0);
~MainWindow();
Q_INVOKABLE unloadPlugin();
signals:
Void unloadPluginSignal();
}
<<<<
MainWindow.cpp
MainWindow::MainWindow(QObject *parent) : QObject(parent)
{
wgt = new QWidget;
…
scene = new QGraphicsScene(…);
…
view = new QGraphicsView(…);
…
engine = new QDeclarativeEngine;
//
add main.qml on scene
//
wgt->show();
}
MainWindow::~MainWindow()
{
qDebug() << “delete mainModel”;
}
void MainWindow::unloadPlugin()
{
emit unloadPluginSignal();
}
<<<<
PluginInterface.h
class PluginInterface : public QObject
{
Q_OBJECT
public:
virtual ~PluginInterface(){}
virtual void getEngine(QDeclarativeEngine *extEngine) =0;
Q_SIGNAL void signalFromPlugin();
};
Q_DECLARE_INTERFACE(PluginInterface, “MyTestPlugin”)
<<<<<
Plugin.h
class Plugin : public PluginInterface
{
Q_OBJECT
Q_INTERFACES(PluginInterface)
public:
~Plugin();
void getEngine();
public slots:
void unloadPlugin();
}
<<<<<
Plugin.cpp
Plugin::~Plugin()
{
qDebug << “delete plugin”;
}
void Plugin::getEngine()
{
//
may get the engine from the main application, but in principle I don’t need it.
//
mainWindow = new MainWindow;
connect(mainWindow, SIGNAL(unloadPluginSignal()), this, SLOT(unloadPlugin()));
}
void Plugin::unloadPlugin()
{
emit signalFromPlugin();
}
Q_EXPORT_PLUGIN2(PluginInterface, Plugin)
Then from main.qml I call the slot with MainWindow - unloadPlugin
main.qml
Rectangel{
…
Rectangel{
…
MouseArea{
anchors.fill: parent
onClocked: mainWindowContext.unloadPlugin()
}
}
}
——-/—/————————
MainApp:
Int main(…)
{
QApplicatino a(argc, argv);
mainWindow = new MainWindow;
return a.exec();
}
MainWindow.h
class MainWindow: public QObject
{
Q_OBJECT
public:
MainModel();
Q_INVOKABLE bool loadPlugin();
public slots:
void unloadPlugin();
private:
PluginInterface *plugin;
QPluginLoader *loader;
}
MainWindow.cpp
MainWindow::MainWindow()
{
wgt = new QWidget;
…
scene = new QGraphicsScene(…);
…
view = new QGraphicsView(…);
…
engine = new QDeclarativeEngine;
//
add main.qml on scene
//
wgt->show();
}
bool MainWindow::loadPlugin()
{
loader = new QPluginLoader(//src plugin//);
If(loader->load())
{
If( plugin = qobject_cast<PluginInterface*>(loader->instance()))
{
plugin->getEngine(engine);
connect(plugin, SIGNAL(signalFromPlugin()), this, SLOT(unloadPlugin()));
return true;
}
return false
}
}
bool Plugin::unloadPlugin()
{
bool result = loader->unload();
qDebug() << result;
}
after clicking on the button in ManApp and calling the loadPlugin method, it is loaded and displayed, but as soon as I click on the close button of this plugin, the unloadPlugin method is called on me and the result variable will return true, after that the application immediately crashes with segmentationFault