KPluginFactory

#include <KPluginFactory>

Inheritance diagram for KPluginFactory:

Classes

struct  InheritanceChecker
 

Signals

void objectCreated (QObject *object)
 

Public Member Functions

 KPluginFactory ()
 
 ~KPluginFactory () override
 
template<typename T >
T * create (QObject *parent=nullptr, const QVariantList &args=QVariantList())
 
template<typename T >
T * create (const QString &keyword, QObject *parent=nullptr, const QVariantList &args=QVariantList())
 
template<typename T >
T * create (QWidget *parentWidget, QObject *parent, const QString &keyword=QString(), const QVariantList &args=QVariantList())
 
template<typename T >
T * create (QObject *parent, const QStringList &args)
 
QObjectcreate (QObject *parent=nullptr, const char *classname="QObject", const QStringList &args=QStringList())
 
- Public Member Functions inherited from QObject
 QObject (QObject *parent)
 
bool blockSignals (bool block)
 
const QObjectListchildren () const const
 
QMetaObject::Connection connect (const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const const
 
void deleteLater ()
 
void destroyed (QObject *obj)
 
bool disconnect (const char *signal, const QObject *receiver, const char *method) const const
 
bool disconnect (const QObject *receiver, const char *method) const const
 
void dumpObjectInfo ()
 
void dumpObjectInfo () const const
 
void dumpObjectTree ()
 
void dumpObjectTree () const const
 
QList< QByteArraydynamicPropertyNames () const const
 
virtual bool event (QEvent *e)
 
virtual bool eventFilter (QObject *watched, QEvent *event)
 
findChild (const QString &name, Qt::FindChildOptions options) const const
 
QList< T > findChildren (const QString &name, Qt::FindChildOptions options) const const
 
QList< T > findChildren (const QRegExp &regExp, Qt::FindChildOptions options) const const
 
QList< T > findChildren (const QRegularExpression &re, Qt::FindChildOptions options) const const
 
bool inherits (const char *className) const const
 
void installEventFilter (QObject *filterObj)
 
bool isWidgetType () const const
 
bool isWindowType () const const
 
void killTimer (int id)
 
virtual const QMetaObjectmetaObject () const const
 
void moveToThread (QThread *targetThread)
 
QString objectName () const const
 
void objectNameChanged (const QString &objectName)
 
QObjectparent () const const
 
QVariant property (const char *name) const const
 
 Q_CLASSINFO (Name, Value)
 
 Q_DISABLE_COPY (Class)
 
 Q_DISABLE_COPY_MOVE (Class)
 
 Q_DISABLE_MOVE (Class)
 
 Q_EMIT Q_EMIT
 
 Q_ENUM (...)
 
 Q_ENUM_NS (...)
 
 Q_ENUMS (...)
 
 Q_FLAG (...)
 
 Q_FLAG_NS (...)
 
 Q_FLAGS (...)
 
 Q_GADGET Q_GADGET
 
 Q_INTERFACES (...)
 
 Q_INVOKABLE Q_INVOKABLE
 
 Q_NAMESPACE Q_NAMESPACE
 
 Q_NAMESPACE_EXPORT (EXPORT_MACRO)
 
 Q_OBJECT Q_OBJECT
 
 Q_PROPERTY (...)
 
 Q_REVISION Q_REVISION
 
 Q_SET_OBJECT_NAME (Object)
 
 Q_SIGNAL Q_SIGNAL
 
 Q_SIGNALS Q_SIGNALS
 
 Q_SLOT Q_SLOT
 
 Q_SLOTS Q_SLOTS
 
qFindChild (const QObject *obj, const QString &name)
 
QList< T > qFindChildren (const QObject *obj, const QRegExp &regExp)
 
QList< T > qFindChildren (const QObject *obj, const QString &name)
 
qobject_cast (QObject *object)
 
qobject_cast (const QObject *object)
 
 QT_NO_NARROWING_CONVERSIONS_IN_CONNECT QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
 
void removeEventFilter (QObject *obj)
 
void setObjectName (const QString &name)
 
void setParent (QObject *parent)
 
bool setProperty (const char *name, const QVariant &value)
 
bool signalsBlocked () const const
 
int startTimer (int interval, Qt::TimerType timerType)
 
int startTimer (std::chrono::milliseconds time, Qt::TimerType timerType)
 
QThreadthread () const const
 

Static Public Member Functions

static QVariantList stringListToVariantList (const QStringList &list)
 
static QStringList variantListToStringList (const QVariantList &list)
 
- Static Public Member Functions inherited from QObject
QMetaObject::Connection connect (const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, Functor functor)
 
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
 
bool disconnect (const QMetaObject::Connection &connection)
 
bool disconnect (const QObject *sender, const char *signal, const QObject *receiver, const char *method)
 
bool disconnect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
 
bool disconnect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
 
QString tr (const char *sourceText, const char *disambiguation, int n)
 
QString trUtf8 (const char *sourceText, const char *disambiguation, int n)
 

Protected Types

typedef QObject *(* CreateInstanceFunction) (QWidget *, QObject *, const QVariantList &)
 

Protected Member Functions

 KPluginFactory (KPluginFactoryPrivate &dd)
 
virtual QObjectcreate (const char *iface, QWidget *parentWidget, QObject *parent, const QVariantList &args, const QString &keyword)
 
virtual QObjectcreateObject (QObject *parent, const char *className, const QStringList &args)
 
virtual KParts::PartcreatePartObject (QWidget *parentWidget, QObject *parent, const char *classname, const QStringList &args)
 
template<class T >
void registerPlugin (const QString &keyword=QString(), CreateInstanceFunction instanceFunction=InheritanceChecker< T >().createInstanceFunction(static_cast< T * >(nullptr)))
 
- Protected Member Functions inherited from QObject
virtual void childEvent (QChildEvent *event)
 
virtual void connectNotify (const QMetaMethod &signal)
 
virtual void customEvent (QEvent *event)
 
virtual void disconnectNotify (const QMetaMethod &signal)
 
bool isSignalConnected (const QMetaMethod &signal) const const
 
int receivers (const char *signal) const const
 
QObjectsender () const const
 
int senderSignalIndex () const const
 
virtual void timerEvent (QTimerEvent *event)
 

Static Protected Member Functions

template<class impl , class ParentType >
static QObjectcreateInstance (QWidget *parentWidget, QObject *parent, const QVariantList &args)
 
template<class impl >
static QObjectcreatePartInstance (QWidget *parentWidget, QObject *parent, const QVariantList &args)
 

Protected Attributes

KPluginFactoryPrivate *const d_ptr
 

Related Functions

(Note that these are not member functions.)

#define K_PLUGIN_CLASS_WITH_JSON(classname, jsonFile)   K_PLUGIN_FACTORY_WITH_JSON(classname ## Factory, jsonFile, registerPlugin<classname >();)
 
#define K_PLUGIN_FACTORY(name, pluginRegistrations)   K_PLUGIN_FACTORY_WITH_BASEFACTORY(name, KPluginFactory, pluginRegistrations)
 
#define K_PLUGIN_FACTORY_DECLARATION(name)   K_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY(name, KPluginFactory)
 
#define K_PLUGIN_FACTORY_DEFINITION(name, pluginRegistrations)   K_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY(name, KPluginFactory, pluginRegistrations)
 
#define K_PLUGIN_FACTORY_WITH_JSON(name, jsonFile, pluginRegistrations)   K_PLUGIN_FACTORY_WITH_BASEFACTORY_JSON(name, KPluginFactory, jsonFile, pluginRegistrations)
 

Additional Inherited Members

- Properties inherited from QObject
 objectName
 
- Public Attributes inherited from QObject
typedef QObjectList
 

Detailed Description

KPluginFactory provides a convenient way to provide factory-style plugins.

Qt plugins provide a singleton object, but a common pattern is for plugins to generate as many objects of a particular type as the application requires. By using KPluginFactory, you can avoid implementing the factory pattern yourself.

KPluginFactory also allows plugins to provide multiple different object types, indexed by keywords.

The objects created by KPluginFactory must inherit QObject, and must have a standard constructor pattern:

  • if the object is a KPart::Part, it must be of the form
    T(QWidget *parentWidget, QObject *parent, const QVariantList &args)
  • if it is a QWidget, it must be of the form
    T(QWidget *parent, const QVariantList &args)
  • otherwise it must be of the form
    T(QObject *parent, const QVariantList &args)

You should typically use either K_PLUGIN_FACTORY() or K_PLUGIN_FACTORY_WITH_JSON() in your plugin code to create the factory. The typical pattern is

#include <KPluginFactory>
#include <plugininterface.h>
class MyPlugin : public PluginInterface
{
public:
MyPlugin(QObject *parent, const QVariantList &args)
: PluginInterface(parent)
{}
};
K_PLUGIN_FACTORY(MyPluginFactory,
registerPlugin<MyPlugin>();
)
#include <myplugin.moc>

If you want to write a custom KPluginFactory not using the standard macro(s) you can reimplement the create(const char *iface, QWidget *parentWidget, QObject *parent, const QVariantList &args, const QString &keyword) method.

Example:

class SomeScriptLanguageFactory : public KPluginFactory
{
public:
SomeScriptLanguageFactory()
{}
protected:
virtual QObject *create(const char *iface, QWidget *parentWidget, QObject *parent, const QVariantList &args, const QString &keyword)
{
const QString identifier = QLatin1String(iface) + QLatin1Char('_') + keyword;
// load scripting language module from the information in identifier
// and return it:
return object;
}
};

If you want to load a library use KPluginLoader. The application that wants to instantiate plugin classes can do the following:

KPluginFactory *factory = KPluginLoader("libraryname").factory();
if (factory) {
PluginInterface *p1 = factory->create<PluginInterface>(parent);
OtherInterface *p2 = factory->create<OtherInterface>(parent);
NextInterface *p3 = factory->create<NextInterface>("keyword1", parent);
NextInterface *p3 = factory->create<NextInterface>("keyword2", parent);
}
Author
Matthias Kretz kretz[email protected]@kde[email protected].org
Bernhard Loos nhuh.[email protected][email protected][email protected]web.d[email protected]e

Definition at line 318 of file kpluginfactory.h.

Member Typedef Documentation

typedef QObject*(* KPluginFactory::CreateInstanceFunction) (QWidget *, QObject *, const QVariantList &)
protected

Function pointer type to a function that instantiates a plugin.

Definition at line 417 of file kpluginfactory.h.

Constructor & Destructor Documentation

KPluginFactory::KPluginFactory ( )
explicit

This constructor creates a factory for a plugin.

Definition at line 20 of file kpluginfactory.cpp.

KPluginFactory::~KPluginFactory ( )
override

This destroys the PluginFactory.

Definition at line 35 of file kpluginfactory.cpp.

Member Function Documentation

template<typename T >
T * KPluginFactory::create ( QObject parent = nullptr,
const QVariantList &  args = QVariantList() 
)
inline

Use this method to create an object.

It will try to create an object which inherits T. If it has multiple choices it's not defined which object will be returned, so be careful to request a unique interface or use keywords.

Template Parameters
TThe interface for which an object should be created. The object will inherit T.
Parameters
parentThe parent of the object. If parent is a widget type, it will also passed to the parentWidget argument of the CreateInstanceFunction for the object.
argsAdditional arguments which will be passed to the object.
Returns
A pointer to the created object is returned, or nullptr if an error occurred.

Definition at line 543 of file kpluginfactory.h.

template<typename T >
T * KPluginFactory::create ( const QString keyword,
QObject parent = nullptr,
const QVariantList &  args = QVariantList() 
)
inline

Use this method to create an object.

It will try to create an object which inherits T and was registered with keyword.

Template Parameters
TThe interface for which an object should be created. The object will inherit T.
Parameters
keywordThe keyword of the object.
parentThe parent of the object. If parent is a widget type, it will also passed to the parentWidget argument of the CreateInstanceFunction for the object.
argsAdditional arguments which will be passed to the object.
Returns
A pointer to the created object is returned, or nullptr if an error occurred.

Definition at line 555 of file kpluginfactory.h.

template<typename T >
T * KPluginFactory::create ( QWidget parentWidget,
QObject parent,
const QString keyword = QString(),
const QVariantList &  args = QVariantList() 
)
inline

Use this method to create an object.

It will try to create an object which inherits T and was registered with keyword. This overload has an additional parentWidget argument, which is used by some plugins (e.g. Parts).

Template Parameters
TThe interface for which an object should be created. The object will inherit T.
Parameters
parentWidgetAn additional parent widget.
parentThe parent of the object. If parent is a widget type, it will also passed to the parentWidget argument of the CreateInstanceFunction for the object.
keywordThe keyword of the object.
argsAdditional arguments which will be passed to the object.
Returns
A pointer to the created object is returned, or nullptr if an error occurred.

Definition at line 567 of file kpluginfactory.h.

template<typename T >
T* KPluginFactory::create ( QObject parent,
const QStringList args 
)
inline
QObject* KPluginFactory::create ( QObject parent = nullptr,
const char *  classname = "QObject",
const QStringList args = QStringList() 
)
inline
QObject * KPluginFactory::create ( const char *  iface,
QWidget parentWidget,
QObject parent,
const QVariantList &  args,
const QString keyword 
)
protectedvirtual

This function is called when the factory asked to create an Object.

You may reimplement it to provide a very flexible factory. This is especially useful to provide generic factories for plugins implemented using a scripting language.

Parameters
ifaceThe staticMetaObject::className() string identifying the plugin interface that was requested. E.g. for KCModule plugins this string will be "KCModule".
parentWidgetOnly used if the requested plugin is a KPart.
parentThe parent object for the plugin object.
argsA plugin specific list of arbitrary arguments.
keywordA string that uniquely identifies the plugin. If a KService is used this keyword is read from the X-KDE-PluginKeyword entry in the .desktop file.

Definition at line 101 of file kpluginfactory.cpp.

QObject * KPluginFactory::createObject ( QObject parent,
const char *  className,
const QStringList args 
)
protectedvirtual
KParts::Part * KPluginFactory::createPartObject ( QWidget parentWidget,
QObject parent,
const char *  classname,
const QStringList args 
)
protectedvirtual
template<class T >
void KPluginFactory::registerPlugin ( const QString keyword = QString(),
CreateInstanceFunction  instanceFunction = InheritanceChecker<T>().createInstanceFunction(static_cast<T *>(nullptr)) 
)
inlineprotected

Registers a plugin with the factory.

Call this function from the constructor of the KPluginFactory subclass to make the create function able to instantiate the plugin when asked for an interface the plugin implements.

You can register as many plugin classes as you want as long as either the plugin interface or the keyword makes it unique. E.g. it is possible to register a KCModule and a KParts::Part without having to specify keywords since their interfaces differ.

Template Parameters
Tthe name of the plugin class
Parameters
keywordAn optional keyword as unique identifier for the plugin. This allows you to put more than one plugin with the same interface into the same library using the same factory. X-KDE-PluginKeyword is a convenient way to specify the keyword in a desktop file.
instanceFunctionA function pointer to a function that creates an instance of the plugin. The default function that will be used depends on the type of interface. If the interface inherits from
  • KParts::Part the function will call
    new T(QWidget *parentWidget, QObject *parent, const QVariantList &args)
  • QWidget the function will call
    new T(QWidget *parent, const QVariantList &args)
  • else the function will call
    new T(QObject *parent, const QVariantList &args)

Definition at line 473 of file kpluginfactory.h.

QVariantList KPluginFactory::stringListToVariantList ( const QStringList list)
static

Converts a QStringList to a QVariantList

Definition at line 154 of file kpluginfactory.cpp.

QStringList KPluginFactory::variantListToStringList ( const QVariantList &  list)
static

Converts a QVariantList of strings to a QStringList

Definition at line 145 of file kpluginfactory.cpp.

Friends And Related Function Documentation

#define K_PLUGIN_CLASS_WITH_JSON (   classname,
  jsonFile 
)    K_PLUGIN_FACTORY_WITH_JSON(classname ## Factory, jsonFile, registerPlugin<classname >();)
related

Create a KPluginFactory subclass and export it as the root plugin object with JSON metadata.

This macro does the same as K_PLUGIN_FACTORY_WITH_JSON, but you only have to pass the class name and the json file. The factory name and registerPlugin call are deduced from the class name.

#include <myplugin.moc>

in the same source file when that one has the name "myplugin.cpp".

Example:

#include <KPluginFactory>
#include <plugininterface.h>
class MyPlugin : public PluginInterface
{
public:
MyPlugin(QObject *parent, const QVariantList &args)
: PluginInterface(parent)
{}
};
K_PLUGIN_CLASS_WITH_JSON(MyPlugin, "metadata.json")
#include <myplugin.moc>
See also
K_PLUGIN_FACTORY_WITH_JSON
Since
5.44

Definition at line 199 of file kpluginfactory.h.

#define K_PLUGIN_FACTORY (   name,
  pluginRegistrations 
)    K_PLUGIN_FACTORY_WITH_BASEFACTORY(name, KPluginFactory, pluginRegistrations)
related

Create a KPluginFactory subclass and export it as the root plugin object.

Parameters
nameThe name of the KPluginFactory derived class.
pluginRegistrationsCode to be inserted into the constructor of the class. Usually a series of registerPlugin() calls.
Note
K_PLUGIN_FACTORY declares the subclass including a Q_OBJECT macro. So you need to make sure to have Qt's moc run also for the source file where you use the macro. E.g. in projects using CMake and it's automoc feature, as usual you need to have a line
#include <myplugin.moc>
in the same source file when that one has the name "myplugin.cpp".

Example:

#include <KPluginFactory>
#include <plugininterface.h>
class MyPlugin : public PluginInterface
{
public:
MyPlugin(QObject *parent, const QVariantList &args)
: PluginInterface(parent)
{}
};
K_PLUGIN_FACTORY(MyPluginFactory,
registerPlugin<MyPlugin>();
)
#include <myplugin.moc>

If you want to compile a .json file into the plugin, use K_PLUGIN_FACTORY_WITH_JSON.

See also
K_PLUGIN_FACTORY_WITH_JSON
K_PLUGIN_FACTORY_DECLARATION
K_PLUGIN_FACTORY_DEFINITION

Definition at line 107 of file kpluginfactory.h.

#define K_PLUGIN_FACTORY_DECLARATION (   name)    K_PLUGIN_FACTORY_DECLARATION_WITH_BASEFACTORY(name, KPluginFactory)
related

K_PLUGIN_FACTORY_DECLARATION declares the KPluginFactory subclass. This macro can be used in a header file.

Parameters
nameThe name of the KPluginFactory derived class.
See also
K_PLUGIN_FACTORY
K_PLUGIN_FACTORY_DEFINITION

Definition at line 212 of file kpluginfactory.h.

#define K_PLUGIN_FACTORY_DEFINITION (   name,
  pluginRegistrations 
)    K_PLUGIN_FACTORY_DEFINITION_WITH_BASEFACTORY(name, KPluginFactory, pluginRegistrations)
related

K_PLUGIN_FACTORY_DEFINITION defines the KPluginFactory subclass. This macro can not be used in a header file.

Parameters
nameThe name of the KPluginFactory derived class.
pluginRegistrationsCode to be inserted into the constructor of the class. Usually a series of registerPlugin() calls.
See also
K_PLUGIN_FACTORY
K_PLUGIN_FACTORY_DECLARATION

Definition at line 227 of file kpluginfactory.h.

#define K_PLUGIN_FACTORY_WITH_JSON (   name,
  jsonFile,
  pluginRegistrations 
)    K_PLUGIN_FACTORY_WITH_BASEFACTORY_JSON(name, KPluginFactory, jsonFile, pluginRegistrations)
related

Create a KPluginFactory subclass and export it as the root plugin object with JSON metadata.

This macro does the same as K_PLUGIN_FACTORY, but adds a JSON file as plugin metadata. See Q_PLUGIN_METADATA() for more information.

Parameters
nameThe name of the KPluginFactory derived class.
pluginRegistrationsCode to be inserted into the constructor of the class. Usually a series of registerPlugin() calls.
jsonFileName of the json file to be compiled into the plugin as metadata
Note
K_PLUGIN_FACTORY_WITH_JSON declares the subclass including a Q_OBJECT macro. So you need to make sure to have Qt's moc run also for the source file where you use the macro. E.g. in projects using CMake and it's automoc feature, as usual you need to have a line
#include <myplugin.moc>
in the same source file when that one has the name "myplugin.cpp".

Example:

#include <KPluginFactory>
#include <plugininterface.h>
class MyPlugin : public PluginInterface
{
public:
MyPlugin(QObject *parent, const QVariantList &args)
: PluginInterface(parent)
{}
};
"metadata.json",
registerPlugin<MyPlugin>();
)
#include <myplugin.moc>
See also
K_PLUGIN_FACTORY
K_PLUGIN_FACTORY_DECLARATION
K_PLUGIN_FACTORY_DEFINITION
Since
5.0

Definition at line 161 of file kpluginfactory.h.


The documentation for this class was generated from the following files:
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Wed Sep 23 2020 23:02:51 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.