在上一章关于librecad源码的内容中,我们已经实现了qt应用主窗口的正常显示,下面我们需要在主窗口中去增加菜单栏、工具栏、工具集、绘图栏、状态栏等等,如下图:
今天,我们先把菜单栏QMenu进行实现,而菜单栏不仅有一级菜单,还有二级菜单,甚至会有更多子级的子菜单,如下图:
也就是说主窗口界面中的菜单栏,其一级菜单只有一个选项,子级菜单可以有很多个,比如父级菜单是&File,那么子级菜单会有**New、Open...、Save、Save as...、Import、Export、Print....**等等。
librecad源码中,关于菜单栏QMenu的显示,实际上我们需要在项目中的ui目录中去查找到LC_ActionFactory和LC_WidgetFactory这两个类,找到这两个类的主要目的:
(1).LC_ActionFactory这个类,使用了 fillActionContainer()方法存储了很多QAction的值,而QAction则是很多菜单和子菜单的name值。除了QAction的name值外,还有相关QAction的信号与槽的实现。
fillActionContainer
(2).LC_WidgetFactory类的QAction与LC_ActionFactory之间的QAction值的关联,是依靠QMap来实现。其中,LC_WidgetFactory类的QMap主要是用的是“键”,而LC_ActionFactory类则通过QMap提供对应的“值”,充分展现QMap的特性。
通过上面两张截图,我们可以知道LCWidgetFatory类的键为“FileNew”, LC_ActionFactory类通过“FileNew”这个键对应的name值为“New”.
如果你还是不明白librecad源码中QMenu菜单的显示实现方式,我们可以在百度文言一心等大数据AI模型中可搜索相关的内容:“QMenu在addMenu时,如何通过QMap设定的键和值,来实现菜单的添加?简单示例”。我这里就不再陈述太多。
实际上,librecad源代码中也正是这样的键值对的做法,让所有QAction都能集中在LC_ActionFactory类中赋值,并通过键对应其name值、菜单图标文件路径、信号与槽的处理。
最后,我就不再使用Cmake的构建方式再去重复librecad源代码中的QMenu的实现,你可以直接用libreCAD源码中的代码文件去一步步复现,因为每个人的代码风格都不太一样,我就不再啰嗦更多。
如果你们有异议,可以在评论区进行更多讨论,我写代码真的很水,希望和大家共同进步。
然后你会发现QMap的某些行为和std::map不一样:joy:
Qt,真的很庞杂。
Popular Ranking
Popular Events
在上一章关于librecad源码的内容中,我们已经实现了qt应用主窗口的正常显示,下面我们需要在主窗口中去增加菜单栏、工具栏、工具集、绘图栏、状态栏等等,如下图:
今天,我们先把菜单栏QMenu进行实现,而菜单栏不仅有一级菜单,还有二级菜单,甚至会有更多子级的子菜单,如下图:
也就是说主窗口界面中的菜单栏,其一级菜单只有一个选项,子级菜单可以有很多个,比如父级菜单是&File,那么子级菜单会有**New、Open...、Save、Save as...、Import、Export、Print....**等等。
一.关于libreCAD源码中菜单栏“QMenu”的实现途径
librecad源码中,关于菜单栏QMenu的显示,实际上我们需要在项目中的ui目录中去查找到LC_ActionFactory和LC_WidgetFactory这两个类,找到这两个类的主要目的:
(1).LC_ActionFactory这个类,使用了
fillActionContainer
()方法存储了很多QAction的值,而QAction则是很多菜单和子菜单的name值。除了QAction的name值外,还有相关QAction的信号与槽的实现。(2).LC_WidgetFactory类的QAction与LC_ActionFactory之间的QAction值的关联,是依靠QMap来实现。其中,LC_WidgetFactory类的QMap主要是用的是“键”,而LC_ActionFactory类则通过QMap提供对应的“值”,充分展现QMap的特性。
通过上面两张截图,我们可以知道LCWidgetFatory类的键为“FileNew”, LC_ActionFactory类通过“FileNew”这个键对应的name值为“New”.
如果你还是不明白librecad源码中QMenu菜单的显示实现方式,我们可以在百度文言一心等大数据AI模型中可搜索相关的内容:“QMenu在addMenu时,如何通过QMap设定的键和值,来实现菜单的添加?简单示例”。我这里就不再陈述太多。
实际上,librecad源代码中也正是这样的键值对的做法,让所有QAction都能集中在LC_ActionFactory类中赋值,并通过键对应其name值、菜单图标文件路径、信号与槽的处理。
最后,我就不再使用Cmake的构建方式再去重复librecad源代码中的QMenu的实现,你可以直接用libreCAD源码中的代码文件去一步步复现,因为每个人的代码风格都不太一样,我就不再啰嗦更多。
如果你们有异议,可以在评论区进行更多讨论,我写代码真的很水,希望和大家共同进步。