Qt Gui 第二十一章
一、创建插件及添加插件
1、创建风格插件
#include <QStylePlugin> class BronzeStylePlugin : public QStylePlugin { public: QStringList keys() const; QStyle *create(const QString &key); };
继承风格插件的接口,并实现keys跟create这两个方法;
QStringList BronzeStylePlugin::keys() const { return QStringList() << "Bronze"; } QStyle *BronzeStylePlugin::create(const QString &key) { if (key.toLower() == "bronze") return new BronzeStyle; return 0; } Q_EXPORT_PLUGIN2(bronzestyleplugin, BronzeStylePlugin)
keys为了该插件导出的时候提供的风格的名字;
当作为插件导出的时候都需要在cpp的末尾添加 : Q_EXPORT_PLUGIN2(插件的名字(自定义), 导出的类名)
在pro中,有两个不一样的地方:
TEMPLATE = lib
CONFIG += plugin
template如果是可执行程序则等于app,这里是作为插件的方式,所以等于lib
然后config也是增加: plugin
构建之后则会产生dll文件和.a文件;这两个就是最后生成的插件;
2、使用该插件
调用插件的方法
之前咱们使用bronzestyle风格的时候:
#include "bronzestyle.h"
然后再使用之前调用 QApplication::setStyle(new BronzeStyle);
当使用插件的方式时候,上面代码都不需要;
只需要: QApplication::setStyle("Bronze");
插件的放置位置:
方法一:将dll跟.a文件放到 plugins\styles的qt目录下面,具体的plugins在哪个位置,可以通过QApplication::libraryPaths()看到;
方法二:在.exe同目录下,新建styles目录,然后将dll跟.a文件放到styles目录下
方法三:假设我在:E:/studydata/qt/qt4src/chap21/bronze/目录下新建了一个styles目录,并将dll跟.a文件放在styles中;则可以通过QApplication::addLibraryPath("E:/studydata/qt/qt4src/chap21/bronze/");的方式指定插件的位置。(不同于默认的目录)
因为该插件继承的是qtcreator的插件接口,所以增加了一个styles的目录,如果是自定义的插件,则无需增加styles目录。
二、动态添加插件
1、自定义插件接口,跟windows的差不多一样。不一样的地方如下红色标记的。Q_DECLARE_INTERFACE(接口的类名, 自定义的标识)
Q_DECLARE_INTERFACE(TextArtInterface, "com.software-inc.TextArt.TextArtInterface/1.0")
class TextArtInterface { public: virtual ~TextArtInterface() {} virtual QStringList effects() const = 0; virtual QPixmap applyEffect(const QString &effect, const QString &text, const QFont &font, const QSize &size, const QPen &pen, const QBrush &brush) = 0; }; Q_DECLARE_INTERFACE(TextArtInterface, "com.software-inc.TextArt.TextArtInterface/1.0")
当要创建插件时候,如上一所描述的,只是将QStylePlugin修改成TextArtInterface接口,并实现TextArtInterface的接口即可。
2、动态加载插件
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName)); if (TextArtInterface* interface = qobject_cast<TextArtInterface*>(loader.instance())) 。 。 。
如上所示,将dll文件(windows)加载进来,然后通过强转判断是否强转成功。如果成功则可以进行接下去的操作。
浙公网安备 33010602011771号