Plugin Class
class Visindigo::General::Plugin此类为Visindigo提供插件基类。. 详情...
| 头文件: | #include <General/Plugin.h> |
| 自以下版本: | Visindigo 0.13.0 |
| 被继承: |
- 所有成员列表(包含继承成员)
- Plugin 是该集合的一部分:VPlugin插件系统子模块.
公开成员函数
(自 Visindigo 0.13.0 引入) | Plugin(Visindigo::General::Version abiVersion = Compiled_VIABI_Version, QString extID = "Visindigo_Base", QObject *parent = nullptr) |
(自 Visindigo 0.13.0 引入) virtual | ~Plugin() |
(自 Visindigo 0.13.0 引入) QList<Visindigo::General::PluginModule *> | getModules() const |
(自 Visindigo 0.13.0 引入) Visindigo::General::Version | getPluginABIVersion() const |
(自 Visindigo 0.13.0 引入) QStringList | getPluginAuthor() const |
(自 Visindigo 0.13.0 引入) Visindigo::Utility::JsonConfig * | getPluginConfig() |
(自 Visindigo 0.13.0 引入) QString | getPluginExtensionID() const |
(自 Visindigo 0.13.0 引入) QDir | getPluginFolder() const |
(自 Visindigo 0.13.0 引入) QString | getPluginID() const |
(自 Visindigo 0.13.0 引入) QString | getPluginName() const |
(自 Visindigo 0.13.0 引入) Visindigo::General::Version | getPluginVersion() const |
(自 Visindigo 0.13.0 引入) bool | isTestEnable() const |
(自 Visindigo 0.13.0 引入) virtual void | onApplicationInit() |
(自 Visindigo 0.13.0 引入) virtual void | onPluginDisbale() |
(自 Visindigo 0.13.0 引入) virtual void | onPluginEnable() |
(自 Visindigo 0.13.0 引入) virtual void | onTest() |
(自 Visindigo 0.13.0 引入) void | setTestEnable() |
受保护成员函数
(自 Visindigo 0.13.0 引入) void | registerPluginModule(Visindigo::General::PluginModule *module) |
(自 Visindigo 0.13.0 引入) void | registerTranslator(Visindigo::General::Translator *translator) |
(自 Visindigo 0.13.0 引入) void | setPluginAuthor(const QStringList &author) |
(自 Visindigo 0.13.0 引入) void | setPluginID(const QString &id) |
(自 Visindigo 0.13.0 引入) void | setPluginName(const QString &name) |
(自 Visindigo 0.13.0 引入) void | setPluginVersion(const Visindigo::General::Version &version) |
相关的非成员内容
(自 Visindigo 0.13.0 引入) | Package |
详细说明
要开发Visindigo插件或应用程序,您就必须实现此类的一个派生。即Visindigo将基于其实现的插件 与基于其实现的应用程序按等同逻辑处理。唯一区别在于它们的加载与卸载顺序,这在Visindigo::General::VIApplication中 有详细说明。
主要函数说明
Plugin类最重要的函数有五个,是用户必须实现的函数,即构造函数,onPluginEnable(),onPluginDisbale(),onApplicationInit()和onTest()。
无论是开发应用程序还是插件,这五个函数都遵循相同的逻辑与原则:
- 构造函数:只用于设置本插件或本应用程序的基础信息,如setPluginID(),setPluginName(),setPluginAuthor()等。除此之外 不应执行任何其他操作,尤其是与Visindigo或其他插件交互的操作,因为在构造函数执行时,Visindigo尚未准备好全部功能,您极有可能遭遇nullptr。
- onPluginEnable():当插件或应用程序被启用时调用。在此函数中,您应进行插件或应用程序的初始化工作,大部分构造操作应该在此进行
- onApplicationInit():当整个应用程序所有的插件都被启用后,它会被按一定顺序调用。您可以在此函数中执行一些需要 所有插件都已启用后才能进行的操作
- onTest():如果您的插件或应用程序被设置为启用测试功能(通过调用setTestEnable()函数),则在所有插件的onApplicationInit()函数调用完毕后, 它会被按一定顺序调用。您可以在此函数中执行一些测试代码
- onPluginDisbale():当插件或应用程序被禁用时调用。在此函数中,您应进行插件或应用程序的清理工作,大部分析构造操作应该在此进行。
- 析构函数:不推荐实现这个函数,保留为编译器默认值即可。如果您确实需要实现它,请确保在析构函数中不与Visindigo或其他插件交互。
作为应用程序主插件(主应用程序包)
需要事先说明的是,如果您不习惯用“插件”称呼您的应用程序,您也可以使用我们在Package.h中提供的别名:
- Visindigo::General::Package (等同于Visindigo::General::Plugin)
- Visindigo::General::PackageModule (等同于Visindigo::General::PluginModule)
- Visindigo::General::PackageManager (等同于Visindigo::General::PluginManager)
这样,您可称呼它们为“应用程序包”、“应用程序包模块”和“应用程序包管理器”,而不是“插件”、“插件模块”和“插件管理器”, 以避免混淆。
稍后,您可以调用VIApplication::setMainPlugin()函数将您的插件类设置为应用程序的主插件(主应用程序包)。具体 调用顺序请参考VIApplication类的文档说明。
作为程序插件
要开发一个Visindigo插件,您首先需要创建一个继承自Visindigo::General::Plugin类的派生类,并实现名为VisindigoPluginMain的函数。这个 函数只做一件事情:新建您的插件类,并且返回它,例如:
extern "C" YSSCore::Editor::Plugin* VisindigoPluginMain() { return new YourPluginClass(); }
Warning: 请注意,VisindigoPluginMain函数必须是extern "C"的,否则Visindigo将无法找到它。
Visindigo会通过此函数取得您的插件实例,并且在适当的时候调用它的各个函数。
但是,若要使Yayin Story Studio能够找到您的插件,您还需要至少三步操作:
1. 在VIApplication的envConfig中指定的插件存放目录下创建存放插件的文件夹,命名可以任选,最好为您的插件ID。
Note: 默认值是"./user_data/plugins",您可以通过调用VIApplication::setEnvConfig()函数更改它。
2. 确保您编译得到的动态链接库文件的后缀名为.vpl(这是全平台统一的),并且放在您的插件文件夹中。
3. 在您的插件文件夹中新建一个与您插件文件同名的json文件,例如“yourplugin.vpl.json",并做如下编辑:
{
"ID": "YourPluginID",
"Depend": [
“PluginID1",
“PluginID2"
]
}
Visindigo在加载插件时会首先搜索所有vpl文件,并且依赖这个与其同名的JSON文件分析插件的依赖信息并决定加载顺序。 json文件中的ID必须和代码中实际设置的ID一致,否则Visindigo将无法找到您的插件。Depend字段是一个字符串数组, 表示您的插件依赖的其他插件的ID。Visindigo会据此调整加载顺序,即在加载插件时,先加载这些依赖的插件,然后再加载您的插件。
请注意,Visindigo无法处理循环依赖。当两个插件相互依赖时,将具有相同的优先等级,Visindigo无法确定其加载顺序。 从源码实现的角度来看,应该会先加载首字母较小的那个插件,但这属于未定义行为,因此请避免出现循环依赖。
Note: 如果您的插件不依赖其他插件,可以将Depend字段省略。
考虑到C++的内存使用极其自由,用户编写代码也极其自由,因此Visindigo不保证任何插件 逻辑的异常安全。任何执行插件函数过程中遭遇的异常都会导致Visindigo直接崩溃。
成员函数文档
[since Visindigo 0.13.0] Plugin::Plugin(Visindigo::General::Version abiVersion = Compiled_VIABI_Version, QString extID = "Visindigo_Base", QObject *parent = nullptr)
abiVersion 插件的ABI版本 extID 插件的扩展ID parent 插件的父对象
对于abiVersion,其已经在头文件中被默认填充为Compiled_YSSABI_Version,代表您的插件编译时Visindigo对应的ABI版本。
插件的扩展ID,是提供给插件扩展开发者的一个标识符,用于确定该插件到底属于哪一类插件。
例如,如果您继承了Plugin并实现了一个Plugin的扩展(姑且称之为PluginV2),然后将PluginV2提供给他人继续开发, 则您的PluginV2的默认构造函数中,就可以将extID设置为"Visindigo_PluginV2",以便后续开发者能够识别这是一个PluginV2类型的插件。
这已经有所实践。在Yayin Story Studio中,插件的extID即为"YayinStoryStudio",标识这是一个继承了YSSCore::Editor::EditorPlugin 所实现的插件。
Warning: 请尤其注意,abiVersion并不是该插件的版本号,也不是Visindigo的API版本。它是Visindigo的ABI版本,它已经 被默认填充了。
这个 function 从 Visindigo 0.13.0 开始支持。
[virtual noexcept, since Visindigo 0.13.0] Plugin::~Plugin()
析构函数
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QList<Visindigo::General::PluginModule *> Plugin::getModules() const
return 插件包含的模块列表
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] Visindigo::General::Version Plugin::getPluginABIVersion() const
return 插件的ABI版本号
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QStringList Plugin::getPluginAuthor() const
return 插件的作者,这是一个列表。
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] Visindigo::Utility::JsonConfig *Plugin::getPluginConfig()
return 插件的设置
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QString Plugin::getPluginExtensionID() const
return 插件的扩展ID
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QDir Plugin::getPluginFolder() const
return 插件的根目录
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QString Plugin::getPluginID() const
return 插件的ID
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QString Plugin::getPluginName() const
return 插件的名称
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] Visindigo::General::Version Plugin::getPluginVersion() const
return 插件的版本号
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool Plugin::isTestEnable() const
return 插件是否为测试模式
这个 function 从 Visindigo 0.13.0 开始支持。
[virtual, since Visindigo 0.13.0] void Plugin::onApplicationInit()
当整个应用程序所有的插件都被启用后调用此函数。此时,您可以安全地调用其他插件的功能。
如果您的插件需要与其他插件交互,则应在此函数中进行相关操作,而不是在onPluginEnable()中进行。
这个 function 从 Visindigo 0.13.0 开始支持。
[virtual, since Visindigo 0.13.0] void Plugin::onPluginDisbale()
禁用插件时调用此函数。大部分涉及到Visindigo内部资源调用的清理都应该在此函数中进行。 如果在析构函数中清理,则有可能因为Visindigo已经开始析构而导致崩溃。此外,此函数 还会被Visindigo捕获异常并输出到日志中。
这个 function 从 Visindigo 0.13.0 开始支持。
[virtual, since Visindigo 0.13.0] void Plugin::onPluginEnable()
启用插件时调用此函数。大部分涉及到Visindigo内部资源调用的初始化都应该在此函数中进行。
如果在构造函数中初始化,则有可能因为Visindigo尚未完全初始化而导致崩溃。此外,此函数 还会被Visindigo捕获异常并输出到日志中。
这个 function 从 Visindigo 0.13.0 开始支持。
[virtual, since Visindigo 0.13.0] void Plugin::onTest()
如果插件被设置为测试模式(通过调用setTestEnable()函数),则在所有插件的onApplicationInit()函数调用完毕后调用此函数。
您可以在此函数中执行一些测试代码,例如输出日志信息、弹出对话框等。
这个 function 从 Visindigo 0.13.0 开始支持。
[protected, since Visindigo 0.13.0] void Plugin::registerPluginModule(Visindigo::General::PluginModule *module)
module 要注册的模块 注册一个编辑器模块
这个 function 从 Visindigo 0.13.0 开始支持。
[protected, since Visindigo 0.13.0] void Plugin::registerTranslator(Visindigo::General::Translator *translator)
translator 要注册的翻译器 注册一个翻译器
这个 function 从 Visindigo 0.13.0 开始支持。
[protected, since Visindigo 0.13.0] void Plugin::setPluginAuthor(const QStringList &author)
author 插件的作者 设置插件的作者
这个 function 从 Visindigo 0.13.0 开始支持。
[protected, since Visindigo 0.13.0] void Plugin::setPluginID(const QString &id)
id 插件的ID 设置插件的ID
这个 function 从 Visindigo 0.13.0 开始支持。
[protected, since Visindigo 0.13.0] void Plugin::setPluginName(const QString &name)
name 插件的名称 设置插件的名称
这个 function 从 Visindigo 0.13.0 开始支持。
[protected, since Visindigo 0.13.0] void Plugin::setPluginVersion(const Visindigo::General::Version &version)
version 插件的版本号 设置插件的版本号
这个 function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void Plugin::setTestEnable()
设置插件为测试模式。只有在测试模式下,onTest函数才会被调用。
这个 function 从 Visindigo 0.13.0 开始支持。
另请参阅 isTestEnable().
相关的非成员内容
[alias, since Visindigo 0.13.0] Package
作为Visindigo::General::Plugin类的别名,方便用户将其称为“应用程序包”。
这个 typedef 从 Visindigo 0.13.0 开始支持。