Qt QMenuBar和QMenu以及QAction巧妙的使用方法

这里简单介绍QMenuBar和QMenu以及QAction是什么,其详细功能本文不做介绍,如果还不了解的朋友可以查阅Qt的帮助手册或浏览其它相关博客。如下图,软件中蓝色条框是QMenuBar用来承载QMenu,红色条框中“文件、编辑、构建……”为QMenu,而每个QMenu点击展开的粉色框内所有可以看到的均为QAction,而点击粉色框内所产生的动作即是绑定在对应QAction的槽函数(对应信号为QAction::triggered())。

在这里插入图片描述


他们之间的关系用框图表示大概像这样子(原谅我的画图水平),一个QMenuBar可以有多个QMenu,一个QMenu可以有多个QAction,每个QAction可以对应多个类成员函数(图中只画出了对应一个函数的情况)。

在这里插入图片描述


OK,简单的介绍到这里就结束了,接下来进入正文。QMenuBar虽然好用,但是也有一定的缺陷,它不能像Map、Vector、List等容器一样可以查找并返回自己的“子节点”。写这篇文章的目的,第一是为了解决QMenuBar没有准确定位其中某一个QMenu或QAction的函数接口;第二是做一下笔记,怕自己忘记。废话不多说了,直接贴代码。

1、代码关键片段

头文件uart_tools_mainwindow.h有关QMenuBar的关键部分代码。

//uart_tools_mainwindow.h class uart_tools_mainwindow; typedef struct { QAction * action_p; QString name; void (uart_tools_mainwindow::*func) (); }main_menu_action; typedef struct { QMenu * menu_p; QString menu_name; QList<main_menu_action> actions_list; }main_menu; class uart_tools_mainwindow : public QWidget { Q_OBJECT ...... ...... ...... private: //---------------------------Member-------------------------- //Menu bar QMenuBar * mainwindow_menubar; QList<main_menu> mainwindow_menu_list; //---------------------------Functions------------------------ void show_connect_window(void); void connect_c0_reconnect(void); void connect_c0_disconnect(void); };

源文件uart_tools_mainwindow.cpp有关QMenuBar的关键部分代码。

this->mainwindow_menubar = new QMenuBar(); this->mainwindow_menubar->setParent(this); main_menu tmp_menu; main_menu_action tmp_action; tmp_menu.menu_name = "Connect"; tmp_menu.menu_p = this->mainwindow_menubar->addMenu(tmp_menu.menu_name); tmp_action.name = "Serial"; tmp_action.action_p = tmp_menu.menu_p->addAction(tmp_action.name); tmp_action.func = &uart_tools_mainwindow::show_connect_window; tmp_menu.actions_list.insert(tmp_menu.actions_list.length() + 1, tmp_action); tmp_action.name = "Reconnect"; tmp_action.action_p = tmp_menu.menu_p->addAction(tmp_action.name); tmp_action.func = &uart_tools_mainwindow::connect_c0_reconnect; tmp_menu.actions_list.insert(tmp_menu.actions_list.length() + 1, tmp_action); tmp_action.name = "Disconnect"; tmp_action.action_p = tmp_menu.menu_p->addAction(tmp_action.name); tmp_action.func = &uart_tools_mainwindow::connect_c0_disconnect; tmp_menu.actions_list.insert(tmp_menu.actions_list.length() + 1, tmp_action); this->mainwindow_menu_list.insert(this->mainwindow_menu_list.length() + 1, tmp_menu); this->mainwindow_menubar->addSeparator(); //Easy to connect signal and slot for (QList<main_menu>::iterator menu_i = this->mainwindow_menu_list.begin(); menu_i < this->mainwindow_menu_list.end(); menu_i++) { if ((*menu_i).menu_p) { for (int action_i = 0; action_i < (*menu_i).actions_list.size(); action_i++) { if ((*menu_i).actions_list.at(action_i).func) { QObject::connect(((*menu_i).actions_list.at(action_i).action_p), &QAction::triggered, this, (*menu_i).actions_list.at(action_i).func); } } } } //End of Easy to connect signal and slot //set menubar and menu background color this->mainwindow_menubar->setStyleSheet("QMenuBar.item{background-color:#E0E0E0;}QMenuBar{background-color:#E0E0E0;}"); this->mainwindow_menubar->show(); 2、运行结果展示

这个软件本身是实现了串口连接的功能,即通过串口连接目标板,进入shell命令行并使用shell命令操作。

在这里插入图片描述

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspzwx.html