1、main主函数

1.1、QApplication对象

在main函数中首先实例化 QApplication 对象 a , QApplication 管理GUI程序的控制和设置,它是整个应用程序的唯一一个实例,其对象指针可以通过 instance() 获取到,和 qApp 宏这个全局变量等效。主要职责包括:

  • 用户桌面设置;
  • 事件处理;
  • 命令行参数处理;
  • GUI外观定义;
  • 本地化如语言设置;

主义处理基本的初始化操作,因此在创建其他UI对象之前必须先创建QApplication对象。

1.2、main函数主要步骤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <QApplication>

int main(int argc, char *argv[])
{

QApplication a(argc,argv);

a.setApplicationName("appName");
a.setApplicationDisplayName("appDisname");
a.setDesktopFileName("deskName");
a.setApplicationVersion("0.01");
a.setOrganizationDomain("com.makerinchina.cn");
a.setOrganizationName("makerinchina");

//plugin mange

//coreplugin

int ret = a.exec();

return ret;
}

一般步骤为:

  • 创建QApplication对象;
  • 设置字体、本地化语言;
  • 这是QSS定义的UI元素外观;
  • 程序启动动画创建;
  • 设置程序名称、版本等信息;
  • 插件框架处理;
  • 执行 a.exec() 进入事件循环,一般等窗口关闭后才会返回;

2、插件加载

2.1、插件框架

插件框架处理步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using namespace ExtensionSystem;

//plugin mange
PluginManager pluginManger;

//plugin IID, only Plugins with this IID are loaded
PluginManager::setPluginIID(QLatin1String("monkeyqdk.qtc.plugin"));

//plugin path
QStringList pluginPath;
pluginPath<<a.applicationDirPath()+"/plugins";

qDebug()<<"plugin path:"<<a.applicationDirPath()+"/plugins";
pluginManger.setPluginPaths(pluginPath);

//load
pluginManger.loadPlugins();

//shutdown when app exit
QObject::connect(&a,&QApplication::aboutToQuit,&pluginManger,&PluginManager::shutdown);
  • 实例化 PluginManger 对象;
  • 设置插件IID 和 插件的路径;
  • 使用loadPlugins() 加载插件;
  • 在app程序退出时候也关闭PluginManger
2.2、核心插件加载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//coreplugin
const QVector<PluginSpec*> plugins = pluginManger.plugins();
PluginSpec *corespec = nullptr;
//find corespec
qDebug()<<__FILE__<<" at line "<<__LINE__<<" :"<<"find core plugin";
for(PluginSpec* spec: plugins){

qDebug()<<__FILE__<<" at line "<<__LINE__<<" :"<<"spec for plugin name "<<spec->name();

if(spec->name() == QLatin1String("CorePlugin")){
corespec = spec;
break;
}
}

//load coreplugin
if(corespec){
corespec->plugin()->remoteCommand(QStringList(),QString(),QStringList());
}else{

//not found core plugin
qDebug()<<__FILE__<<" at line "<<__LINE__<<" :"<<"no corePlugin found,exit.";
pluginManger.shutdown();

a.quit();
return -1;
}
  • 遍历插件,然后通过插件描述pluginspec找到名字为 CorePlugin 的插件;
  • 执行插件,这里是显示主界面;
  • 如果没有找到则退出;