概述
采用自顶向下的方法,先来看看怎么使用,然后再分析是怎么实现的。
创建插件的方式有两种:
* 上层API,用来扩展Qt库的功能,例如增加数据库驱动、图片格式的支持、以及自定义应用程序风格。
* 底层API,用来扩展Qt应用程序的功能。
使用上层API编写Qt扩展(自定义风格)
编写一个自定义风格的插件,Qt示例。
文件清单
plugin.pro
simplestyle.cpp 插件的实现
simplestyle.h
simplestyle.json 描述关键字
simplestyleplugin.cpp 简单工厂,根据指定的关键字,生成相应的对象
simplestyleplugin.h
plugin.pro其中,这一行是自己加行去的OTHER_FILES += simplestyle.json
,方便在QtCreator中查看。
#! [0]
TEMPLATE = lib
CONFIG += plugin
QT += widgets
HEADERS = simplestyle.h \
simplestyleplugin.h
SOURCES = simplestyle.cpp \
simplestyleplugin.cpp
TARGET = simplestyleplugin
OTHER_FILES += simplestyle.json
simplestyleplugin.h
插件工厂类
#include <QStylePlugin>
QT_BEGIN_NAMESPACE
class QStringList;
class QStyle;
QT_END_NAMESPACE
//! [0]
class SimpleStylePlugin : public QStylePlugin
{
Q_OBJECT
//由moc生成meta信息,Qt库获取的key的时候使用的是simplestyle.json文件里面的关键字。
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "simplestyle.json")
public:
SimpleStylePlugin() {}
//QStringList keys() const; //这个函数是没有作用的,大概是老版本的Qt使用这个函数来获取关键字,示例程序还没有修改吧。
QStyle *create(const QString &key) Q_DECL_OVERRIDE;
};
//! [0]
simplestyleplugin.cpp
插件工厂类的实现
#include <QtWidgets>
#include "simplestyleplugin.h"
#include "simplestyle.h"
//! [1]
//简单工厂,根据关键字,来生成相应的对象,可以实现在一个插件内支持多种风格。
QStyle *SimpleStylePlugin::create(const QString &key)
{
if (key.toLower() == "simplestyle")
return new SimpleStyle;
return 0;
}
//! [1]
simplestyle.h
和simplestyle.cpp
,是这个简单风格的实现。
#include <QtWidgets>
#include "simplestyle.h"
//把QPushButton的背景设置为红色
void SimpleStyle::polish(QPalette &palette)
{
palette.setBrush(QPalette::Button, Qt::red);
}
simplestyle.json
用来描述支持的风格名称,可以有多个,以分号隔开。
{
"Keys": [ "simplestyle" ]
}
测试的时候,把生成的libsimplestyleplugin.so
复制到安装目录下的plugins/styles
目录里,或者用qt.conf来指定插件目录路径。