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");
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;
PluginManager pluginManger;
PluginManager::setPluginIID(QLatin1String("monkeyqdk.qtc.plugin"));
QStringList pluginPath; pluginPath<<a.applicationDirPath()+"/plugins";
qDebug()<<"plugin path:"<<a.applicationDirPath()+"/plugins"; pluginManger.setPluginPaths(pluginPath);
pluginManger.loadPlugins();
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
| const QVector<PluginSpec*> plugins = pluginManger.plugins(); PluginSpec *corespec = nullptr;
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; } }
if(corespec){ corespec->plugin()->remoteCommand(QStringList(),QString(),QStringList()); }else{
qDebug()<<__FILE__<<" at line "<<__LINE__<<" :"<<"no corePlugin found,exit."; pluginManger.shutdown();
a.quit(); return -1; }
|
- 遍历插件,然后通过插件描述pluginspec找到名字为 CorePlugin 的插件;
- 执行插件,这里是显示主界面;
- 如果没有找到则退出;