libreCAD源码阅读笔记1

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,并且维护着一个打开文件的文件列表。
LC_Applicaiton

3.src/Main/QC_ApplicationWindow

  • 主窗口

QC_ApplicaitonWindow作为程序主窗口,继承自MainWindowX类,该类主要实现了几个控制浮动窗口关闭与否的函数,也提供根据浮动窗口标题记性排序功能。大部分程序功能在QC_ApplicationWindow中实现。程序主窗口由QMdiArea/QMdiSubWindow构建多文档类型主窗口。主窗口中维护着各种浮动窗口(图层控制、鼠标面板、画笔面板。。。)、菜单栏、工具栏、状态栏等窗口部件。
QC_ApplicationWindow

  • 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类、各种浮动窗口、工具栏、菜单栏、各种事件初始化等内容。

© 版权声明
THE END
喜欢就支持一下吧
点赞350 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容