❝这个例子展示了如何创建一个以新的GUI外观扩展Qt的插件。❞
Qt中的插件是存储在共享库中的类,可以在运行时由QPluginLoader加载。在Qt中创建插件时,它们要么扩展Qt应用程序,要么扩展Qt本身。编写可扩展Qt本身的插件是通过继承插件基类之一,从该类重新实现功能并添加宏来实现的。在此示例中,我们通过添加新的GUI外观(即,使新的QStyle)来扩展Qt 。插件概述文档中对插件进行了高级介绍。
提供新样式的插件会继承QStylePlugin基类。样式插件由Qt加载并通过QStyleFactory提供。我们已经实现了SimpleStylePlugin,它提供了SimpleStyle。新样式通过以红色绘制按钮背景为小部件样式。
从某种意义上说,新样式与平台无关,因为它不是基于任何特定的样式实现,而是使用QProxyStyle来调整默认为本机系统样式的当前应用程序样式中的外观。
注意:在某些平台上,本机样式将阻止按钮具有红色背景。在这种情况下,请尝试以其他样式(例如Fusion)运行示例。还可设置simplestyle.cpp
的QPalette::Button
设置为QPalette::Window
。
我们使用测试插件StyleWindow,在其中显示QPushButton。在SimpleStyle和StyleWindow类不包含任何插件的特定功能及其实现是微不足道的。因此,我们将跳过它们并继续使用SimpleStylePlugin和main()功能。看完之后,我们检查插件的配置文件。
1. SimpleStylePlugin类定义
SimpleStylePlugin继承QStylePlugin,它们都是插件类。
代码语言:javascript复制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将使用此插件创建它。
2. SimpleStylePlugin类实现
- 这是实现
keys()
:
QStringList SimpleStylePlugin::keys() const
{
return {"SimpleStyle"};
}
由于此插件仅支持一种样式,因此我们返回带有该样式的类名称的QStringList。
- 这是
create()
函数:
QStyle *SimpleStylePlugin::create(const QString &key)
{
if (key.toLower() == "simplestyle")
return new SimpleStyle;
return nullptr;
}
需要注意的是,「样式插件的键不区分大小写。大小写敏感度因插件而异,因此在实现新插件时需要进行检查」。
- 该main()函数:
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();
}
初始化QApplication对象时,Qt会加载可用的样式插件。QStyleFactory类能获取到所有样式,并使用create()
生成它们(它是所有样式插件的包装)。
3. 简单样式插件配置文件
SimpleStylePlugin位于其自己的目录中,并且具有自己的配置文件:
代码语言:javascript复制TEMPLATE = lib
CONFIG = plugin
QT = widgets
HEADERS = simplestyle.h
simplestyleplugin.h
SOURCES = simplestyle.cpp
simplestyleplugin.cpp
TARGET = simplestyleplugin
在插件配置文件中,我们需要在构建共享库而不是可执行文件时设置lib模板。我们还必须将CONFIG
设置为plugin
。我们还将库设置为存储在stylewindow下的styles文件夹中,因为这是Qt在其中搜索样式插件的路径。
4. 关于更多
- 在「QtCreator软件」可以找到:
- 或在以下「Qt安装目录」找到:
C:Qt{你的Qt版本}Examples{你的Qt版本}widgetstoolsstyleplugin
- 「相关链接」
https://doc.qt.io/qt-5/qtwidgets-tools-styleplugin-example.html