| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the documentation of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:FDL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Free Documentation License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Free |
| ** Documentation License version 1.3 as published by the Free Software |
| ** Foundation and appearing in the file included in the packaging of |
| ** this file. Please review the following information to ensure |
| ** the GNU Free Documentation License version 1.3 requirements |
| ** will be met: https://www.gnu.org/licenses/fdl-1.3.html. |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| /*! |
| \page plugins-howto.html |
| \title How to Create Qt Plugins |
| \brief A guide to creating plugins to extend Qt's applications and functionalities. |
| |
| \ingroup frameworks-technologies |
| \ingroup qt-basic-concepts |
| \ingroup best-practices |
| |
| |
| \keyword QT_DEBUG_PLUGINS |
| \keyword QT_NO_PLUGIN_CHECK |
| |
| Qt provides two APIs for creating plugins: |
| |
| \list |
| \li A high-level API for writing extensions to Qt itself: custom database |
| drivers, image formats, text codecs, custom styles, etc. |
| \li A low-level API for extending Qt applications. |
| \endlist |
| |
| For example, if you want to write a custom QStyle subclass and |
| have Qt applications load it dynamically, you would use the |
| higher-level API. |
| |
| Since the higher-level API is built on top of the lower-level API, |
| some issues are common to both. |
| |
| If you want to provide plugins for use with Qt Designer, see the Qt Designer |
| module documentation. |
| |
| Topics: |
| |
| \tableofcontents |
| |
| \section1 The High-Level API: Writing Qt Extensions |
| |
| Writing a plugin that extends Qt itself is achieved by |
| subclassing the appropriate plugin base class, implementing a few |
| functions, and adding a macro. |
| |
| There are several plugin base classes. Derived plugins are stored |
| by default in sub-directories of the standard plugin directory. Qt |
| will not find plugins if they are not stored in the appropriate directory. |
| |
| The following table summarizes the plugin base classes. Some of the classes |
| are private, and are therefore not documented. You can use them, but there |
| is no compatibility promise with later Qt versions. |
| |
| \table |
| \header |
| \li Base Class |
| \li Directory Name |
| \li Qt Module |
| \li Key Case Sensitivity |
| \row |
| \li QAccessibleBridgePlugin |
| \li \c accessiblebridge |
| \li \l{Qt GUI} |
| \li Case Sensitive |
| |
| \row |
| \li QImageIOPlugin |
| \li \c imageformats |
| \li \l{Qt GUI} |
| \li Case Sensitive |
| \row |
| \li QPictureFormatPlugin (obsolete) |
| \li \c pictureformats |
| \li \l{Qt GUI} |
| \li Case Sensitive |
| \row |
| \li QAudioSystemPlugin |
| \li \c audio |
| \li \l{Qt Multimedia} |
| \li Case Insensitive |
| \row |
| \li QDeclarativeVideoBackendFactoryInterface |
| \li \c video/declarativevideobackend |
| \li \l{Qt Multimedia} |
| \li Case Insensitive |
| \row |
| \li QGstBufferPoolPlugin |
| \li \c video/bufferpool |
| \li \l{Qt Multimedia} |
| \li Case Insensitive |
| \row |
| \li QMediaPlaylistIOPlugin |
| \li \c playlistformats |
| \li \l{Qt Multimedia} |
| \li Case Insensitive |
| \row |
| \li QMediaResourcePolicyPlugin |
| \li \c resourcepolicy |
| \li \l{Qt Multimedia} |
| \li Case Insensitive |
| \row |
| \li QMediaServiceProviderPlugin |
| \li \c mediaservice |
| \li \l{Qt Multimedia} |
| \li Case Insensitive |
| \row |
| \li QSGVideoNodeFactoryPlugin |
| \li \c video/videonode |
| \li \l{Qt Multimedia} |
| \li Case Insensitive |
| \row |
| \li QBearerEnginePlugin |
| \li \c bearer |
| \li \l{Qt Network} |
| \li Case Sensitive |
| \row |
| \li QPlatformInputContextPlugin |
| \li \c platforminputcontexts |
| \li \l{Qt Platform Abstraction} |
| \li Case Insensitive |
| \row |
| \li QPlatformIntegrationPlugin |
| \li \c platforms |
| \li \l{Qt Platform Abstraction} |
| \li Case Insensitive |
| \row |
| \li QPlatformThemePlugin |
| \li \c platformthemes |
| \li \l{Qt Platform Abstraction} |
| \li Case Insensitive |
| \row |
| \li QGeoPositionInfoSourceFactory |
| \li \c position |
| \li \l{Qt Positioning} |
| \li Case Sensitive |
| \row |
| \li QPlatformPrinterSupportPlugin |
| \li \c printsupport |
| \li \l{Qt Print Support} |
| \li Case Insensitive |
| \row |
| \li QSGContextPlugin |
| \li \c scenegraph |
| \li \l{Qt Quick} |
| \li Case Sensitive |
| \row |
| \li QScriptExtensionPlugin |
| \li \c script |
| \li \l{Qt Script} |
| \li Case Sensitive |
| \row |
| \li QSensorGesturePluginInterface |
| \li \c sensorgestures |
| \li \l{Qt Sensors} |
| \li Case Sensitive |
| \row |
| \li QSensorPluginInterface |
| \li \c sensors |
| \li \l{Qt Sensors} |
| \li Case Sensitive |
| \row |
| \li QSqlDriverPlugin |
| \li \c sqldrivers |
| \li \l{Qt SQL} |
| \li Case Sensitive |
| \row |
| \li QIconEnginePlugin |
| \li \c iconengines |
| \li \l{Qt SVG} |
| \li Case Insensitive |
| \row |
| \li QAccessiblePlugin |
| \li \c accessible |
| \li \l{Qt Widgets} |
| \li Case Sensitive |
| \row |
| \li QStylePlugin |
| \li \c styles |
| \li \l{Qt Widgets} |
| \li Case Insensitive |
| \endtable |
| |
| If you have a new style class called \c MyStyle that you |
| want to make available as a plugin, the class needs to be defined |
| as follows (\c mystyleplugin.h): |
| |
| \snippet plugins/doc_src_plugins-howto.cpp 0 |
| |
| Ensure that the class implementation is located in a \c .cpp file: |
| |
| \snippet plugins/doc_src_plugins-howto.cpp 1 |
| |
| (Note that QStylePlugin is case-insensitive, and the lowercase |
| version of the key is used in our |
| \l{QStylePlugin::create()}{create()} implementation; most other |
| plugins are case sensitive.) |
| |
| In addition, a json file (\c mystyleplugin.json) containing meta data |
| describing the plugin is required for most plugins. For style |
| plugins it simply contains a list of styles that can be created |
| by the plugin: |
| |
| \snippet plugins/doc_src_plugins-howto.qdoc 6 |
| |
| The type of information that needs to be provided in the json file |
| is plugin dependent, please see the class documentation for |
| details on the information that needs to be contained in the |
| file. |
| |
| For database drivers, image formats, text codecs, and most other |
| plugin types, no explicit object creation is required. Qt will |
| find and create them as required. Styles are an exception, since |
| you might want to set a style explicitly in code. To apply a |
| style, use code like this: |
| |
| \snippet plugins/doc_src_plugins-howto.cpp 2 |
| |
| Some plugin classes require additional functions to be |
| implemented. See the class documentation for details of the |
| virtual functions that must be reimplemented for each type of |
| plugin. |
| |
| The \l{Style Plugin Example} shows how to implement a plugin |
| that extends the QStylePlugin base class. |
| |
| \section1 The Low-Level API: Extending Qt Applications |
| |
| Not only Qt itself but also Qt application can be extended |
| through plugins. This requires the application to detect and load |
| plugins using QPluginLoader. In that context, plugins may provide |
| arbitrary functionality and are not limited to database drivers, |
| image formats, text codecs, styles, and the other types of plugin |
| that extend Qt's functionality. |
| |
| Making an application extensible through plugins involves the |
| following steps: |
| |
| \list 1 |
| \li Define a set of interfaces (classes with only pure virtual |
| functions) used to talk to the plugins. |
| \li Use the Q_DECLARE_INTERFACE() macro to tell Qt's |
| \l{meta-object system} about the interface. |
| \li Use QPluginLoader in the application to load the plugins. |
| \li Use qobject_cast() to test whether a plugin implements a given |
| interface. |
| \endlist |
| |
| Writing a plugin involves these steps: |
| |
| \list 1 |
| \li Declare a plugin class that inherits from QObject and from the |
| interfaces that the plugin wants to provide. |
| \li Use the Q_INTERFACES() macro to tell Qt's \l{meta-object |
| system} about the interfaces. |
| \li Export the plugin using the Q_PLUGIN_METADATA() macro. |
| \li Build the plugin using a suitable \c .pro file. |
| \endlist |
| |
| For example, here's the definition of an interface class: |
| |
| \snippet plugins/interfaces.h 2 |
| |
| Here's the definition of a plugin class that implements that |
| interface: |
| |
| \snippet plugins/extrafiltersplugin.h 0 |
| |
| The \l{tools/plugandpaint/app}{Plug & Paint} example documentation |
| explains this process in detail. See also \l{Creating Custom |
| Widgets for Qt Designer} for information about issues that are |
| specific to Qt Designer. You can also take a look at the |
| \l{Echo Plugin Example} which is a more trivial example on |
| how to implement a plugin that extends Qt applications. |
| Please note that a QCoreApplication must have been initialized |
| before plugins can be loaded. |
| |
| \section1 Locating Plugins |
| |
| Qt applications automatically know which plugins are available, |
| because plugins are stored in the standard plugin subdirectories. |
| Because of this applications don't require any code to find and load |
| plugins, since Qt handles them automatically. |
| |
| During development, the directory for plugins is \c{QTDIR/plugins} |
| (where \c QTDIR is the directory where Qt is installed), with each |
| type of plugin in a subdirectory for that type, for example, \c styles. If |
| you want your applications to use plugins and you don't want to use |
| the standard plugins path, have your installation process |
| determine the path you want to use for the plugins, and save the |
| path, for example, by using QSettings, for the application to read when it |
| runs. The application can then call QCoreApplication::addLibraryPath() |
| with this path and your plugins will be available to the application. |
| Note that the final part of the path (for example, \c styles) cannot be changed. |
| |
| If you want the plugin to be loadable then one approach is to |
| create a subdirectory under the application, and place the plugin |
| in that directory. If you distribute any of the plugins that come |
| with Qt (the ones located in the \c plugins directory), you must |
| copy the subdirectory under \c plugins where the plugin is |
| located to your applications root folder (i.e., do not include the |
| \c plugins directory). |
| |
| For more information about deployment, |
| see the \l {Deploying Qt Applications} and \l {Deploying Plugins} |
| documentation. |
| |
| \section1 Static Plugins |
| |
| The normal and most flexible way to include a plugin with an |
| application is to compile it into a dynamic library that is shipped |
| separately, and detected and loaded at runtime. |
| |
| Plugins can be linked statically into your application. If you |
| build the static version of Qt, this is the only option for |
| including Qt's predefined plugins. Using static plugins makes the |
| deployment less error-prone, but has the disadvantage that no |
| functionality from plugins can be added without a complete rebuild |
| and redistribution of the application. |
| |
| To link plugins statically, you need to add |
| the required plugins to your build using \c QTPLUGIN. |
| |
| In the \c .pro file for your application, you need the following |
| entry: |
| |
| \snippet plugins/doc_src_plugins-howto.pro 5 |
| |
| qmake automatically adds the plugins to QTPLUGIN that are typically |
| needed by the Qt modules used (see \l QT), while more specialized |
| plugins need to be added manually. |
| The default list of automatically added plugins can be overridden |
| per type. |
| For example, to link the minimal plugin instead of the default Qt |
| platform adaptation plugin, use: |
| |
| \snippet plugins/doc_src_plugins-howto.pro 4 |
| |
| If you want neither the default, nor the minimal QPA plugin to be |
| linked automatically, use: |
| |
| \snippet plugins/doc_src_plugins-howto.pro 6 |
| |
| The defaults are tuned towards an optimal out-of-the-box experience, |
| but may unnecessarily bloat the application. |
| It is recommended to inspect the linker command line built by qmake |
| and eliminate unnecessary plugins. |
| |
| \section2 Details of Linking Static Plugins |
| |
| To cause static plugins actually being linked and instantiated, |
| Q_IMPORT_PLUGIN() macros are also needed in application code, |
| but those are automatically generated by qmake and added to |
| your application project. |
| |
| If you do not want all plugins added to QTPLUGIN to be automatically |
| linked, remove \c import_plugins from the \c CONFIG variable: |
| |
| \snippet plugins/doc_src_plugins-howto.pro 7 |
| |
| \section2 Creating Static Plugins |
| |
| It is also possible to create your own static plugins, by |
| following these steps: |
| |
| \list 1 |
| \li Add \c{CONFIG += static} to your plugin's \c .pro file. |
| \li Use the Q_IMPORT_PLUGIN() macro in your application. |
| \li Use the Q_INIT_RESOURCE() macro in your application if the plugin ships |
| qrc files. |
| \li Link your application with your plugin library using \c LIBS |
| in the \c .pro file. |
| \endlist |
| |
| See the \l{tools/plugandpaint/app}{Plug & Paint} example and the |
| associated \l{tools/plugandpaint/plugins/basictools}{Basic Tools} |
| plugin for details on how to do this. |
| |
| \note If you are not using qmake to build your plugin you need |
| to make sure that the \c{QT_STATICPLUGIN} preprocessor macro is |
| defined. |
| |
| \section1 Deploying and Debugging Plugins |
| |
| The \l{Deploying Plugins} document covers the process of deploying |
| plugins with applications and debugging them when problems arise. |
| |
| \sa QPluginLoader, QLibrary, {Plug & Paint Example} |
| */ |