qt 的插件
什么是插件
插件是一种遵循一定规范的应用程序接口编写出来的程序,定位于开发实现应用软件平台不具备的功能的程序。
2个特点:
1、基于接口编程
2、提供扩展性
qt插件的2种形式
可以有2种插件形式
1、动态插件,也就是动态库
2、静态插件
插件是一个动态库,可以在运行时加载该库以扩展应用程序。Qt使得创建自定义插件并使用QPluginLoader加载它们成为可能。为了确保插件不会丢失,还可以将它们静态链接到可执行文件
示例可以查看Qt的demo: Plug & Paint Example | Qt Widgets 5.15.6
plugin实现
对于插件工程来说,需要实现一个接口:
- 定义一个继承 QObject 和 接口的插件;
- 使用
Q_INTERFACES()
声明使用的接口类型;在moc中支持按照对应的接口转换。 - 使用
Q_PLUGIN_METADATA()
宏导出元信息;在moc中导出元数据和类。
class ExtraFiltersPlugin : public QObject, public FilterInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.FilterInterface" FILE "extrafilters.json")
Q_INTERFACES(FilterInterface)
public:
QStringList filters() const override;
QImage filterImage(const QString &filter, const QImage &image,
QWidget *parent) override;
};
主程序实现
对于主工程来说,需要定一个插件的接口:
动态:
- 使用
Q_DECLARE_INTERFACE()
是生成对应接口转换函数 qobject_cast ;Q_INTERFACES 也会用到。
- 使用
QPluginLoader
来加载插件; - 使用
qobject_cast()
进行插件造型,判断插件实现了哪个接口;
静态:
1、Q_IMPORT_PLUGIN(BasicToolsPlugin),导入类
2、QPluginLoader::staticInstances() 加载静态插件