Style Plugin Example¶
This example shows how to create a plugin that extends Qt with a new GUI look and feel.
A plugin in Qt is a class stored in a shared library that can be loaded by a
QPluginLoader
at run-time. When you create plugins in Qt, they either extend a Qt application or Qt itself. Writing a plugin that extends Qt itself is achieved by inheriting one of the plugin base classes , reimplementing functions from that class, and adding a macro. In this example we extend Qt by adding a new GUI look and feel (i.e., making a newQStyle
available). A high-level introduction to plugins is given in the plugin overview document.Plugins that provide new styles inherit the
QStylePlugin
base class. Style plugins are loaded by Qt and made available throughQStyleFactory
; we will look at this later. We have implementedSimpleStylePlugin
, which providesSimpleStyle
. The new style contributes to widget styling by drawing button backgrounds in red - not a major contribution, but it still makes a new style.The new style is platform agnostic in the sense that it is not based on any specific style implementation, but uses
QProxyStyle
to merely tweak the looks in the current application style that defaults to the native system style.Note
On some platforms, the native style will prevent the button from having a red background. In this case, try to run the example in another style (e.g., fusion).
We test the plugin with
StyleWindow
, in which we display aQPushButton
. TheSimpleStyle
andStyleWindow
classes do not contain any plugin specific functionality and their implementations are trivial; we will therefore leap past them and head on to theSimpleStylePlugin
and themain()
function. After we have looked at that, we examine the plugin’s profile.
SimpleStylePlugin Class Definition¶
SimpleStylePlugin
inheritsQStylePlugin
and is the plugin class.class SimpleStylePlugin : public QStylePlugin { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "simplestyle.json") public: SimpleStylePlugin() = default; QStringList keys() const; QStyle *create(const QString &key) override; };
keys()
returns a list of style names that this plugin can create, whilecreate()
takes such a string and returns theQStyle
corresponding to the key. Both functions are pure virtual functions reimplemented fromQStylePlugin
. When an application requests an instance of theSimpleStyle
style, which this plugin creates, Qt will create it with this plugin.
SimpleStylePlugin Class Implementation¶
Here is the implementation of
keys()
:QStringList SimpleStylePlugin::keys() const { return {"SimpleStyle"}; }Since this plugin only supports one style, we return a
QStringList
with the class name of that style.Here is the
create()
function:QStyle *SimpleStylePlugin::create(const QString &key) { if (key.toLower() == "simplestyle") return new SimpleStyle; return nullptr; }Note that the key for style plugins are case insensitive. The case sensitivity varies from plugin to plugin, so you need to check this when implementing new plugins.
The
main()
function¶
int main(int argv, char *args[]) { QApplication app(argv, args); QApplication::setStyle(QStyleFactory::create("simplestyle")); StyleWindow window; window.resize(200, 50); window.show(); return app.exec(); }Qt loads the available style plugins when the
QApplication
object is initialized. TheQStyleFactory
class knows about all styles and produces them withcreate()
(it is a wrapper around all the style plugins).
The Simple Style Plugin Profile¶
The
SimpleStylePlugin
lives in its own directory and have its own profile:<Code snippet "tools/styleplugin/plugin/plugin.pro:0" not found>In the plugin profile we need to set the lib template as we are building a shared library instead of an executable. We must also set the config to plugin. We set the library to be stored in the styles folder under stylewindow because this is a path in which Qt will search for style plugins.
© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.