Qt官方示例-样式插件

2023-03-17 14:52:41 浏览数 (2)

❝这个例子展示了如何创建一个以新的GUI外观扩展Qt的插件。❞

 Qt中的插件是存储在共享库中的类,可以在运行时由QPluginLoader加载。在Qt中创建插件时,它们要么扩展Qt应用程序,要么扩展Qt本身。编写可扩展Qt本身的插件是通过继承插件基类之一,从该类重新实现功能并添加宏来实现的。在此示例中,我们通过添加新的GUI外观(即,使新的QStyle)来扩展Qt 。插件概述文档中对插件进行了高级介绍。

  提供新样式的插件会继承QStylePlugin基类。样式插件由Qt加载并通过QStyleFactory提供。我们已经实现了SimpleStylePlugin,它提供了SimpleStyle。新样式通过以红色绘制按钮背景为小部件样式。

  从某种意义上说,新样式与平台无关,因为它不是基于任何特定的样式实现,而是使用QProxyStyle来调整默认为本机系统样式的当前应用程序样式中的外观。

  注意:在某些平台上,本机样式将阻止按钮具有红色背景。在这种情况下,请尝试以其他样式(例如Fusion)运行示例。还可设置simplestyle.cppQPalette::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()
代码语言:javascript复制
QStringList SimpleStylePlugin::keys() const
{
    return {"SimpleStyle"};
}

由于此插件仅支持一种样式,因此我们返回带有该样式的类名称的QStringList。

  • 这是create()函数:
代码语言:javascript复制
QStyle *SimpleStylePlugin::create(const QString &key)
{
    if (key.toLower() == "simplestyle")
        return new SimpleStyle;
    return nullptr;
}

需要注意的是,「样式插件的键不区分大小写。大小写敏感度因插件而异,因此在实现新插件时需要进行检查」

  • 该main()函数:
代码语言:javascript复制
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安装目录」找到:
代码语言:javascript复制
C:Qt{你的Qt版本}Examples{你的Qt版本}widgetstoolsstyleplugin
  • 「相关链接」
代码语言:javascript复制
https://doc.qt.io/qt-5/qtwidgets-tools-styleplugin-example.html

0 人点赞