[software development] librecad源码阅读:关于菜单栏QMenu控件的实现,需要使用到QMap
Tofloor
poster avatar
deepin
2023-12-17 07:09
Author

在上一章关于librecad源码的内容中,我们已经实现了qt应用主窗口的正常显示,下面我们需要在主窗口中去增加菜单栏、工具栏、工具集、绘图栏、状态栏等等,如下图:

51811702719828_.pic.jpg

今天,我们先把菜单栏QMenu进行实现,而菜单栏不仅有一级菜单,还有二级菜单,甚至会有更多子级的子菜单,如下图:

image.png

也就是说主窗口界面中的菜单栏,其一级菜单只有一个选项,子级菜单可以有很多个,比如父级菜单是&File,那么子级菜单会有**New、Open...、Save、Save as...、Import、Export、Print....**等等。

一.关于libreCAD源码中菜单栏“QMenu”的实现途径

librecad源码中,关于菜单栏QMenu的显示,实际上我们需要在项目中的ui目录中去查找到LC_ActionFactoryLC_WidgetFactory这两个类,找到这两个类的主要目的:

(1).LC_ActionFactory这个类,使用了 fillActionContainer()方法存储了很多QAction的值,而QAction则是很多菜单和子菜单的name值。除了QAction的name值外,还有相关QAction的信号与槽的实现。

image.png

(2).LC_WidgetFactory类的QAction与LC_ActionFactory之间的QAction值的关联,是依靠QMap来实现。其中,LC_WidgetFactory类的QMap主要是用的是“键”,而LC_ActionFactory类则通过QMap提供对应的“值”,充分展现QMap的特性。

image.png

通过上面两张截图,我们可以知道LCWidgetFatory类的为“FileNew”, LC_ActionFactory类通过“FileNew”这个键对应的name值为“New”.

如果你还是不明白librecad源码中QMenu菜单的显示实现方式,我们可以在百度文言一心等大数据AI模型中可搜索相关的内容:“QMenu在addMenu时,如何通过QMap设定的键和值,来实现菜单的添加?简单示例”。我这里就不再陈述太多。

image.png

实际上,librecad源代码中也正是这样的键值对的做法,让所有QAction都能集中在LC_ActionFactory类中赋值,并通过键对应其name值菜单图标文件路径信号与槽的处理


最后,我就不再使用Cmake的构建方式再去重复librecad源代码中的QMenu的实现,你可以直接用libreCAD源码中的代码文件去一步步复现,因为每个人的代码风格都不太一样,我就不再啰嗦更多。

如果你们有异议,可以在评论区进行更多讨论,我写代码真的很水,希望和大家共同进步。

Reply Favorite View the author
All Replies
fuuko
deepin
2023-12-17 18:25
#1

然后你会发现QMap的某些行为和std::map不一样:joy:

Reply View the author
deepin
2023-12-18 03:34
#2
fuuko

然后你会发现QMap的某些行为和std::map不一样:joy:

doubt

Qt,真的很庞杂。

Reply View the author