如何创建Qt Plugins (插件)之 使用高级api

  • Post author:
  • Post category:其他



Qt提供了2个api来创建插件:

QStringList SimpleStylePlugin::keys() const
{
    return QStringList() << "SimpleStyle";
}


  • 一个高级的api 用来写Qt自己本身的插件:如自定义数据库驱动,图片格式,text codecs, 自定义样式,etc.

  • 一个低级的api用来扩展Qt的applications.

比如,如果你想写一个自定义的QStyle的子类, 并且用Qt applications 动态来加载,你就可以使用高级的api.

由于高级的api是建立在低级的api之上的,因此在某些情形下他们都是可用的.

如果你想要为用户提供Qt Designer的插件,查看Qt Designer的模块的文档。

观点:



高级API: 写Qt 的扩展。

为Qt本身写插件通过合适的插件父类来定义子类,实现一些新的功能,添加一些宏。



插件的基类有多种。驱动插件基类在标准的插件子类的目录中。Qt将找不到这些插件如果他们不被存储在合适的目录当中。



如果你有个新的样式类叫 MyStyle你将把他做成一个可访问的plugin. 这个类需要定义为如下(mystyleplugin.h):

class MyStylePlugin : public QStylePlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "mystyleplugin.json")
public:
    QStyle *create(const QString &key);
};


保证这个类实现在本地的一个.cpp文件:

#include "mystyleplugin.h"

QStyle *MyStylePlugin::create(const QString &key)
{
    if (key.toLower() == "mystyle")
        return new MyStyle;
    return 0;
}

(注意:QStylePlugin是不区分大小写的,而且小写的key的版本在create()中实现;大多数其他的插件是区分大小写的。)




另外, 在一个json文件中(mystyleplugin.json)包含了meta data描述的插件在大多数插件中是需要的。对于style plugins它简单包括了被插件创建的一个样式列表。

{ "Keys": [ "mystyleplugin" ] }

类的类型信息被包含在这个json文件中,这个文件和插件是相互独立的,查看这个类的文档信息,看多少信息是必须要包含这个文件中的。




对于 database drivers, image formats, text codecs, 他和大多数其他类型的插件一个,没有特殊的对象需要创建。Qt将会根据需要创建。Styles是一个例外,因此你需要显示的设置样式。为了应用样式,需要这样用:

QApplication::setStyle(QStyleFactory::create("MyStyle"));

一些插件类必须实现一些额外的函数。查看的某些类型的插件必须实现的虚函数的细节文档。




样式插件的例子:实现一个样式插件扩展QStylePlugin基类。

///QStylePlugin

class SimpleStylePlugin : public QStylePlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "simplestyle.json")

public:
    SimpleStylePlugin() {}

    QStringList keys() const;
    QStyle *create(const QString &key) Q_DECL_OVERRIDE;
};


QStringList SimpleStylePlugin::keys() const
{
    return QStringList() << "SimpleStyle";
}

因为这个插件只支持一种样式,所以这里只返回了包含类名的QStringList.


这个有一个create()函数:

QStyle *SimpleStylePlugin::create(const QString &key)
{
    if (key.toLower() == "simplestyle")
        return new SimpleStyle;
    return 0;
}

注意这个style插件的key是大小写敏感的,包括从plugin到plugin都是不同的,因此在实现一个新的插件时你需要做检查。




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();
}

Qt加载相应类型的插件当QApplication对象已经初始化。这个QStyleFactory类知道所有的样式并创建他们通过create()(它是一个所有样式插件的包装)。


这个Simple Style Plugin的pro文件:

TEMPLATE    = lib
CONFIG     += plugin
QT         += widgets
HEADERS     = simplestyle.h \
              simplestyleplugin.h
SOURCES     = simplestyle.cpp \
              simplestyleplugin.cpp
TARGET      = simplestyleplugin

在这个plugin的pro文件中,我们可以设置这个lib的模板因为我们会编译一个共享lib的库而不是用一个可执行的库。我们也必须设置插件的配置文件。我们设置设个库可以存储所有的样式,在一个叫stylewindow的文件夹中,Qt可以在这个路径中找到所有的样式插件。

///QStylePlugin





http://doc.qt.io/qt-5/plugins-howto.html


http://doc.qt.io/qt-5/qtwidgets-tools-styleplugin-example.html