Qt提供了2个api来创建插件:
QStringList SimpleStylePlugin::keys() const
{
return QStringList() << "SimpleStyle";
}
class MyStylePlugin : public QStylePlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "mystyleplugin.json")
public:
QStyle *create(const QString &key);
};
#include "mystyleplugin.h"
QStyle *MyStylePlugin::create(const QString &key)
{
if (key.toLower() == "mystyle")
return new MyStyle;
return 0;
}
{ "Keys": [ "mystyleplugin" ] }
类的类型信息被包含在这个json文件中,这个文件和插件是相互独立的,查看这个类的文档信息,看多少信息是必须要包含这个文件中的。
QApplication::setStyle(QStyleFactory::create("MyStyle"));
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";
}
QStyle *SimpleStylePlugin::create(const QString &key)
{
if (key.toLower() == "simplestyle")
return new SimpleStyle;
return 0;
}
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
在这个plugin的pro文件中,我们可以设置这个lib的模板因为我们会编译一个共享lib的库而不是用一个可执行的库。我们也必须设置插件的配置文件。我们设置设个库可以存储所有的样式,在一个叫stylewindow的文件夹中,Qt可以在这个路径中找到所有的样式插件。