Now I work on application with plugins.
So I have one interface and lots of plugins based on it:
class PluginWidgetInterface
{
public:
virtual ~PluginWidgetInterface() {}
//---------------------------- SIGNALS ---------------------------
virtual void MessageSend() = 0;
};
#define PluginWidgetInterface_iid "myplugins.PluginWidgetInterface"
Q_DECLARE_INTERFACE(PluginWidgetInterface, PluginWidgetInterface_iid)
class PluginWidgetInterface
{
public:
virtual ~PluginWidgetInterface() {}
virtual QWidget * GetWidget() = 0;
//---------------------------- SIGNALS ---------------------------
virtual void MessageSend() = 0;
};
#define PluginWidgetInterface_iid "myplugins.PluginWidgetInterface"
Q_DECLARE_INTERFACE(PluginWidgetInterface, PluginWidgetInterface_iid)
To copy to clipboard, switch view to plain text mode
and plugin implementation:
#include "plugininterface.h"
class Plugin1
: public QObject,PluginWidgetInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "myplugins.Plugin1")
Q_INTERFACES(PluginWidgetInterface)
public:
~Plugin1() {}
//---------------------------- SIGNALS ---------------------------
void MessageSend();
};
#include "plugininterface.h"
class Plugin1 : public QObject,PluginWidgetInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "myplugins.Plugin1")
Q_INTERFACES(PluginWidgetInterface)
public:
~Plugin1() {}
QWidget * GetWidget();
//---------------------------- SIGNALS ---------------------------
void MessageSend();
};
To copy to clipboard, switch view to plain text mode
but at this point i have troubles with connect(). Because the Interface class not derived from QObject I cant use it with connect();
If i cast it to QObject i get 0x0.
PluginWidgetInterface * plugin = qobject_cast<PluginWidgetInterface *>(loader.instance());
QWidget * widget
= plugin
->GetWidget
();
QObject * o
= dynamic_cast<QObject
*>
(plugin
);
// here o = NULL connect(o,SIGNAL(MessageSend),this,SLOT(MessageReceived));
QPluginLoader loader("plugin.dll");
PluginWidgetInterface * plugin = qobject_cast<PluginWidgetInterface *>(loader.instance());
QWidget * widget = plugin->GetWidget();
QObject * o = dynamic_cast<QObject *>(plugin); // here o = NULL
connect(o,SIGNAL(MessageSend),this,SLOT(MessageReceived));
To copy to clipboard, switch view to plain text mode
I would like to do it in new style
connect(o,&PluginWidgetInterface::MessageSend,this,&MainWindow::MessageReceived);
connect(o,&PluginWidgetInterface::MessageSend,this,&MainWindow::MessageReceived);
To copy to clipboard, switch view to plain text mode
but i got error:
no matching function for call to 'MainWindow::connect(QObject*&, void (PluginWidgetInterface::*)(), MainWindow* const, void (MainWindow::*)())
So what is right way to define interface with signals to connect inheritance to slots?
Bookmarks