Skip to content

Latest commit

 

History

History
101 lines (65 loc) · 3.92 KB

插件与接口.md

File metadata and controls

101 lines (65 loc) · 3.92 KB

da-work-flow通过插件实现功能,通过接口实现数据的交互

通过插件和接口两个模块可以实现整个核心逻辑的调用,da-work-flow的各个模块间依赖关系如下图所示:

zh-uml-module-relation

总体可以分为4大部分:

  • 第三方库
  • DA公共库
  • 应用程序
  • 插件

da-work-flow的功能都通过插件提供,不同插件可提供不同功能,而程序只提供一个基本框架,因此,要开发具体功能,需要首先面对两个模块,一个是插件(DAPluginSupport)一个是接口(DAIterface)

zh-uml-interface

通过接口可调用到整个程序的所有其他模块

插件模块DAPluginSupport

插件的支持模块为DAPluginSupport

DAAbstractPlugin是插件的基类,其中有个非常关键的函数core:

DACoreInterface* core() const;

这个函数是插件和框架的沟通基础,此函数获取了基础接口DACoreInterfaceda-work-flow的所有接口基于此接口都可以获取,由此,插件实现和界面以及核心逻辑的交互

da-work-flow的插件使用Qt的插件系统实现,DAAbstractPlugin通过Q_DECLARE_INTERFACE声明为插件,而插件的管理提供了单例DAPluginManager实现所有插件的管理,插件在加载过程之前,需要把接口传入,因此,插件在加载时即可调用接口提供的所有功能进行操作

插件最关键有如下两个虚函数:

/**
    * @brief 发生语言变更事件的时候调用此函数
    * 默认没有实现,如果插件有涉及翻译,需要重载此函数
    */
virtual void retranslate();

/**
    * @brief 初始化
    * @return 如果初始化返回false,将不会把插件放入管理中,默认返回true
    */
virtual bool initialize();

其中initialize函数用于插件的初始化,如果初始化过程返回false,系统将跳过这个插件

retranslate是在语言发生变化时调用,对于多语言的处理,可以在继承此函数

插件在加载是会传入接口,在插件中操作程序都通过接口完成,通过DAAbstractPlugin::core函数可获取顶层接口:

DACoreInterface* core() const;

通用插件

da-work-flow针对程序需求,提供了一些通用插件

工作流节点插件DAAbstractNodePlugin

DAAbstractNodePlugin负责生成工作流的节点,可以通过编写此插件提供不同功能的节点,具体详见工作流.md

接口模块DAInterface

接口模块位于DAInterface,接口的UML图如下:

zh-uml-interface

DACoreInterface是接口类的基础,从此接口可以获取其他的关键接口,例如DAAppUIInterface主要负责UI相关的接口,DAProjectInterface主要负责工程管理的接口,DADataManagerInterface主要负责数据管理相关的接口

界面的操作主要由DAAppUIInterface管理,DAAppUIInterface下可以获取界面相关的其他接口,如负责ribbon界面的接口DAAppRibbonAreaInterface,以及负责dock窗口的接口DAAppDockingAreaInterface

接口的创建顺序

接口创建过程有相互顺序,避免在一个接口调用一个还未创建的接口

  1. DACoreInterface 首先创建,然后调用DACoreInterface::initialized进行初始化
  2. 接着调用initializePythonEnv,初始化Python环境
  3. 实例化DADataManagerInterface
  4. 实例化DAProjectInterface
  5. 主界面构造
  6. 调用DACoreInterface::createUi 开始构造界面
  7. 实例化DAAppUIInterface
  8. 调用DAAppUIInterface::createUi
  9. 实例化DACommandInterface
  10. 实例化DAAppActionsInterface
  11. 实例化DAAppDockingAreaInterface
  12. 实例化DAAppRibbonAreaInterface

整个app的区域划分如下图所示:

app-area

DAAppRibbonAreaInterface负责Action Area的控制

DAAppDockingAreaInterface