[Interest] Qt Plugin Low Level API

Roland Winklmeier roland.m.winklmeier at gmail.com
Thu May 22 10:01:54 CEST 2014


Hi Etienne,

there are two requirements:

1. The interface must be pure virtual (so it cannot derive from QObject)
2. qobject_cast requires a QObject subclass

Hence, your plugin implementation must inherit from both. The
implementation itself can derive from QObject but the interface cannot.
The main question here is if you want to use signal/slots with your plugin.
Since the interface is pure virtual there is no chance to connect a signal
or slot to it. I therefore introduced a factory pattern in my
implementations:

class IFactory
{
public:

    //! \brief Virtual destructor
    virtual ~IFactory() {}

    virtual IPluginObject *create(QObject *parent = nullptr) = 0;
};

class Q_DECL_EXPORT CFactory : public QObject, public IFactory
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "your.interface.name")
    Q_INTERFACES(IFactory)

public:
    virtual IPluginObject *create(QObject *parent) override;
};

class IPluginObject : public QObject
{
public:

    //! \brief Virtual destructor
    virtual ~IPluginObject() {}

public slots:

    void someSlot () = 0;

signals:

    void someSignal() {} = 0;
};

As you can see only the factory is exported as a pure virtual interface.
Your real plugin object interface is subclassing QObject. I usually
implement all plugins way as long as I'm 100 % sure I never going to use
signal/slots.

Hope that helps a bit.

Roland


2014-05-22 9:55 GMT+02:00 Samuel Stirtzel <s.stirtzel at googlemail.com>:

> 2014-05-22 9:37 GMT+02:00 Etienne Sandré-Chardonnal <
> etienne.sandre at m4x.org>:
> > Dear all,
> >
> > I'm reading the doc in order to implement plugins into my Qt 4.8
> > application.
> >
> > The manual says that I need first to define the plugin interface as a
> pure
> > virtual class. In the example it does not inherit QObject.
> >
> > Then it shows an example plugin implementation which inherits from
> QObject
> > and the interface class (multiple inheritance)
> >
> > Then it says "use qobject_cast() to test whether a plugin implement a
> given
> > interface". However, the qobject_cast page clearly says that the target
> > class type must inherit QObject.
> >
> > I dit not try compiling an example yet, but how could this work?
> Shouldn't
> > the interface inherit QObject, and the plugin implementation simply
> inherit
> > the interface class?
> >
>
> Hi,
>
> look up the Q_DECLARE_INTERFACE macro definition.
>
> The docs describe this as "Use the Q_DECLARE_INTERFACE() macro to tell
> Qt's meta-object system about the interface."
>
>
> --
> Regards
> Samuel
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20140522/de3980d7/attachment.html>


More information about the Interest mailing list