QT 样式插件示例
这个例子展示了如何创建一个扩展 Qt 并具有新的 GUI 外观的插件。
Qt 中的插件是存储在共享库中的类,可以在运行时由QPluginLoader加载。在 Qt 中创建插件时,它们要么扩展 Qt 应用程序,要么扩展 Qt 本身。编写扩展 Qt 本身的插件是通过继承插件基类之一、从该类重新实现函数并添加宏来实现的。在这个例子中,我们通过添加新的 GUI 外观和感觉来扩展 Qt(即,使新的QStyle可用)。插件概述文档中给出了对插件的高级介绍。
提供新样式的插件继承QStylePlugin基类。样式插件由 Qt 加载并通过QStyleFactory提供;我们稍后再看。我们已经实施SimpleStylePlugin
,它提供了SimpleStyle
. 新样式通过将按钮背景绘制为红色来为小部件样式做出贡献——这不是主要贡献,但它仍然是一种新样式。
新样式与平台无关,因为它不基于任何特定样式实现,而是使用QStyleFactory仅调整默认为本机系统样式的当前应用程序样式中的外观。
注意:在某些平台上,原生样式会阻止按钮具有红色背景。在这种情况下,请尝试以另一种方式运行示例(例如,融合)。
我们用 测试插件StyleWindow
,在其中我们显示一个QPushButton。和SimpleStyle
类StyleWindow
不包含任何插件特定的功能,它们的实现是微不足道的;因此,我们将跳过它们并继续使用SimpleStylePlugin
和main()
函数。在我们看过之后,我们检查插件的配置文件。
SimpleStylePlugin 类定义
SimpleStylePlugin
继承QStylePlugin,是插件类。
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()
返回此插件可以创建的样式名称列表,同时create()
采用这样的字符串并返回与键对应的QStyle 。这两个函数都是从QStylePlugin重新实现的纯虚函数。当应用程序请求该插件创建的SimpleStyle
样式实例时,Qt 将使用该插件创建它。
SimpleStylePlugin 类实现
QStringList SimpleStylePlugin::keys() const { return {"SimpleStyle"}; }
由于这个插件只支持一种样式,我们返回一个带有该样式类名的QStringList 。
这是create()
功能:
QStyle *SimpleStylePlugin::create(const QString &key) { if (key.toLower() == "simplestyle") return new SimpleStyle; return nullptr; }
请注意,样式插件的键不区分大小写。区分大小写因插件而异,因此在实施新插件时需要检查这一点
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 在初始化QApplication对象时加载可用的样式插件。QStyleFactory类知道所有样式并使用 create() 生成它们(它是所有样式插件的包装器)。
简单样式插件配置文件
TEMPLATE = lib CONFIG += plugin QT += widgets HEADERS = simplestyle.h \ simplestyleplugin.h SOURCES = simplestyle.cpp \ simplestyleplugin.cpp TARGET = simplestyleplugin
在插件配置文件中,我们需要设置 lib 模板,因为我们正在构建共享库而不是可执行文件。我们还必须将配置设置为插件。我们将库设置为存储在 stylewindow 下的样式文件夹中,因为这是 Qt 搜索样式插件的路径。