[Interest] Qt Plugin Low Level API

Etienne Sandré-Chardonnal etienne.sandre at m4x.org
Thu May 22 13:05:05 CEST 2014


Thanks for your explanations!

Let's start working on the plugin system...

Etienne


2014-05-22 10:01 GMT+02:00 Roland Winklmeier <roland.m.winklmeier at gmail.com>
:

> 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
>>
>
>
> _______________________________________________
> 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/31103986/attachment.html>


More information about the Interest mailing list