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)加载进来,然后通过强转判断是否强转成功。如果成功则可以进行接下去的操作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!