libreCAD源码阅读笔记1
一 前言:
正如官网(https://www.librecad.org)所说,libreCAD是一个开源的CAD制图软件,可以运行在Windows、Apple、Linux平台之上。事实上libreCAD是QCAD的一个简易版本实现,只不过libreCAD采用全C++实现,而QCAD采用了C++结合EcmaScript语言实现(参考https://blog.csdn.net/mrbaolong/category_10265952.html?spm=1001.2014.3001.5482)。
二 libreCAD源码学习
1.src/Main/Main.cpp
分析main函数,大体上也就完成了以下工作。在初始化LC_Application之后,程序还读取了相关配置信息(QSettings),如果是第一次加载程序,在QG_DlgInitial界面设置相关内容,然后调用程序启动画面(QSplashScreen),同时加载其他组件等内容。待准备工作完成后,启动程序主窗口。
2.src/Main/LC_Application
LC_Application继承QApplication,并且维护着一个打开文件的文件列表。
3.src/Main/QC_ApplicationWindow
- 主窗口
QC_ApplicaitonWindow作为程序主窗口,继承自MainWindowX类,该类主要实现了几个控制浮动窗口关闭与否的函数,也提供根据浮动窗口标题记性排序功能。大部分程序功能在QC_ApplicationWindow中实现。程序主窗口由QMdiArea/QMdiSubWindow构建多文档类型主窗口。主窗口中维护着各种浮动窗口(图层控制、鼠标面板、画笔面板。。。)、菜单栏、工具栏、状态栏等窗口部件。
- Action
LC_ActionFactory 类相当于一个工具类,生成程序Action。主窗口a_map变量保存维护一个 【名称-Action】对应关系,每个Action触发后,调用QG_ActionHandler中的槽函数。具体代码参考如下:
QC_ApplicationWindow.h--99-100行
QMap<QString, QAction*> a_map;
LC_ActionGroupManager* ag_manager {nullptr};
QC_ApplicationWindow.cpp--239-258行
LC_ActionFactory a_factory(this, actionHandler);
a_factory.using_theme = settings.value("Widgets/AllowTheme", 0).toBool();
a_factory.fillActionContainer(a_map, ag_manager);//生成各种Action
void LC_ActionFactory::fillActionContainer(QMap<QString, QAction*>& a_map, LC_ActionGroupManager* agm)
{
QAction* action;
// <[~ Zoom ~]>
action = new QAction(tr("Zoom &Panning"), agm->other);
action->setIcon(QIcon(":/icons/zoom_pan.svg"));
connect(action, SIGNAL(triggered()),
action_handler, SLOT(slotZoomPan()));
action->setObjectName("ZoomPan");
a_map["ZoomPan"] = action;
// <[~ Select ~]>
action = new QAction(tr("Select Entity"), agm->select);
action->setIcon(QIcon(":/icons/select_entity.svg"));
connect(action, SIGNAL(triggered()),
action_handler, SLOT(slotSelectSingle()));
action->setObjectName("SelectSingle");
a_map["SelectSingle"] = action;
另外一个比较特别的就是QG_ActionHandler类,负责处理从主窗口触发的各种事件(Actions)与RS_GraphicView/RS_Document等内容交互。
三 结语
学习了main函数的大体过程和涉及的主要类。同时也有许多下一步要继续搞明白的内容:QC_MDIWindow类、QG_ActionHandler类、各种浮动窗口、工具栏、菜单栏、各种事件初始化等内容。
暂无评论内容