[software development] librecad源码阅读:关于绘图文档窗口的实现,需要使用QMdiArea
Tofloor
poster avatar
deepin
2023-12-21 10:09
Author

在librecad软件里,界面主要的工作区域是绘图区,而绘图文档窗口及更多子文档的实现,主要依赖于QMdiArea和QMdiSubWindow这两个类来实现。具体最基本的代码实现过程如下图:

image.png

UI效果图:

image.png


通过上面最基本代码展示和实现过程,我们也可以在librecad源码中找到相应的实现过程。

image.png

首先,我们可以查看一下librecad这个软件在最初打开时显示的子文档窗口的标题等信息展示,可以发现标题在未自定义的情况,标题名为:“unnamed document 1 [Draft Mode]”.

从“unnamed document 1 [Draft Mode]”这段标题名信息来看,“unnamed document”为软件绘图区域新建子文档窗口默认的命名前缀,我们可以在Vscode代码编辑器中通过全局搜索查找“unnamed document”这个命名前缀。

image.png

我们继续对代码向上追踪,能够实现子文档标题命名的函数名称为 QC_ApplicationWindow::slotFileNew(RS_Document* doc) ,也就是slotFileNew()这个新建子文档窗口的方法。

一. 关于librecad源码中能够调用slotFileNew()的相关函数。

对于slotFileNew()方法调用的函数,主要有3个,如下:

(1).函数slotFileNewHelper;

image.png

(2)函数slotFileOpen;

image.png

(3).函数createNewDocument.

image.png

那么,这三个函数到底谁被真正调用,或者说是librecad的界面第一次打开就能实现自动添加子文档窗口呢?

这个,我们需要从源代码中的main.cpp文件中去查看,因为main函数中能够创建QC_ApplicationWindow类对象,这个对象通过指针变量appWin来调用**slotFileNewNew()**函数方法,如下图:

image.png

我们继续进入到QC_ApplicationWindow类中的slotFileNewNew()方法函数里面,并查看它的代码,看它会调用上面3个函数方法中的哪一个。

image.png

从上图代码内容来看,QC_ApplicationWindow类中的slotFileNewNew()方法在代码逻辑处理过程中使用了第1个函数slotFileNewHelper(),然后间接调用soltFileNew方法。

二.当QMdiArea容器内的子文档QMdiSubWindow数量较多时,需要布局排版

在上面的源代码分析过程中,我们只是针对第一次创建的子文档窗口的实现,也就是只有一个QMdiSubWindow时的实现。如果QMdiSubWindow添加的数量较多时,我们需要对其进行排版归纳,让数量较多的QMdiSubWindow能够更容易管理。

首先,数量较多的QMdiSubWindow,其排版样式的选择方法要从QC_ApplicationWindow类的构造函数中调用,通过**setTabLayout()**函数来实现。

image.png

在setTabLayout函数方法中,它继续调用doArrangeWindows(RS::Maximized)函数来实现逻辑更加细腻的排版设置。

image.png

image.png

image.png

关于这个子文档窗口的排版样式设置,代码具体实现的逻辑我就不再陈述太多,主要还是通过QMdiArea这个容器类的相关函数方法实现,从而管控数量较多的QMdiSubWindow的布局。


最后,librecad界面中的绘图区域的子文档窗口,最基本的实现仍是通过QMdiArea和QMdiSubWindow,相关具体的实现过程,你们可以在QC_ApplicationWindow这个类中进行更具体的了解,希望能够对2D CAD得开发者有更多帮助。

Reply Favorite View the author
All Replies

No replies yet