插件(扩展名)
扩展是一个共享的动态库,旨在在执行主应用程序时加载,该程序必须实现至少一个特殊接口。
扩展分为两种类型:
让我们弄清楚如何创建自己的扩展系统以及扩展本身。
与扩展的通信是使用接口(信号,插槽和类方法)进行的。 该扩展由应用程序使用QPluginLoader类加载。 要加载扩展,请使用instance()方法,该方法创建一个扩展对象并返回指向该对象的指针。 unload()方法用于卸载扩展。
第一部分
在第一个示例中,创建一个扩展,该扩展将使用该扩展中的函数(算法,公式)。
该项目的视觉方案将如下所示。

阶段1:
第一步是创建一个继承自QObject的接口类,作为接口,将有一个方法采用QString类型的变量并以大写形式返回相同的字符串。 使用Q_DECLARE_INTERFACE宏,设置接口的标识符,编译器c生成标识符字符串的元信息。 该模块是插件和主程序之间的通信协议,将在插件项目和主项目中使用。
该类如下所示。
阶段2:
让我们创建一个将下载扩展的基本应用程序。 按下按钮,将搜索该扩展名并将其加载到系统中。 进一步通过界面,我们将使用我们的功能。
基本应用程序:
主项目
mainproject.cpp
阶段3:
创建扩展,首先要做的是更改pro文件中正在构建的项目的类型,为此,您需要添加以下行TEMPLATE = lib,并为CONFIG + =插件扩展设置项目配置。
upperstringplugin.pro
#------------------------------------------------- # # Project created by QtCreator 2019-04-03T11:35:18 # #------------------------------------------------- QT += core greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = upperStringPlugin TEMPLATE = lib CONFIG += plugin DESTDIR = ../Plugins DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ upperstringplugin.cpp HEADERS += \ upperstringplugin.h \ interface.h
接下来,我们为将来的扩展创建一个类,该类应从接口的类继承。 宏Q_INTERFACES ,您需要编译器为扩展生成所有必要的元信息。 Q_PLUGIN_METADATA()宏将入口点设置为扩展和对Qt库的访问。 您还需要创建一个具有元信息的inteface.json文件(该文件必须位于项目的根目录中),在本例中,该文件中没有任何信息,因此只需在文件中写空的引号{}。
upperstringplugin.h
upperstringplugin.cpp
在编译项目的输出中,我们得到一个扩展名为.so的文件,将该文件移到主项目的Plugins文件夹中,然后启动它。 在这种情况下,扩展被加载到主程序中并创建一个扩展对象。 如果尝试重用instance()函数,该函数将返回一个指向已创建的扩展对象的指针。
程序执行

第二部分
为了使我们的任务复杂化,现在我们需要将扩展名添加为小部件,并具有创建多个此类小部件的能力。 主程序将从插件接收消息并发送回响应。 我们将创建新项目,在第一阶段,我们需要两类接口,一类负责加载扩展并创建小部件,另一类负责小部件本身的操作。
项目计划如下所示:

阶段1:
第一个接口类将具有两个函数,获取插件的名称和获取插件的小部件。 插件的名称将被存储以在系统中标识。 我们将插件小部件添加到主应用程序的MDI窗口中。
第二类是图形控件本身,它是从QWidget继承的,这里我们指定了所需的功能,该控件将接收一条消息并将其发送到主程序。
接口
阶段2:
主程序包含一个MDI窗口,在该窗口中有一个主窗口小部件,用于接收来自插件的消息,以及在调用插件时动态显示的其他窗口。
创建插件窗口小部件时,我们将信号从插件连接到插槽,并使用sender()函数获得指向发送消息的插件的指针。 我们将创建的窗口小部件放置在MDI窗口中,然后可以从系统中卸载插件对象本身。
主项目
mainproject.cpp
主窗口接受该消息并显示。
mainwidget.h
mainwidget.cpp
阶段2:
我们创建一个插件,它的想法是它是一个用于创建小部件的工厂。
plugin.h
plugin.cpp
插件创建的小部件。
texttranferwidget.h
texttranferwidget.cpp
主程序的输出:
