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

摘要:
如下图所示,QMenuBar使用软件中的蓝色条来托管QMenu,红色条“file,edit,build…”中的它们之间的关系用框图表示。QMenuBar可以有多个QMenu,QMenu可以有多条QAction,每个QAction可以对应多个类成员函数。本文的第一个目的是解决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------------------------
//Init menu bar
    void init_menubar(void);
    void new_action_to_menu(main_menu *menu, QString act_name, void (uart_tools_mainwindow::*func) (void));
    
//Menu bar action funcs
	void show_connect_window(void);
	void connect_c0_reconnect(void);
    void connect_c0_disconnect(void);
};    

源文件uart_tools_mainwindow.cpp的init_menubar()函数实现;

void uart_tools_mainwindow::init_menubar()
{
    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);

    this->new_action_to_menu(&tmp_menu, "Serial", &uart_tools_mainwindow::show_connect_window);
    this->new_action_to_menu(&tmp_menu, "Reconnect", &uart_tools_mainwindow::connect_c0_reconnect);
    this->new_action_to_menu(&tmp_menu, "Disconnect", &uart_tools_mainwindow::connect_c0_disconnect);
    
    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();
    return;
}    

源文件uart_tools_mainwindow.cpp的new_action_to_menu()函数实现;

void uart_tools_mainwindow::new_action_to_menu(main_menu *menu, QString act_name, void (uart_tools_mainwindow::*func) (void))
{
    main_menu_action tmp_action;

    tmp_action.name = act_name;
    tmp_action.action_p = menu->menu_p->addAction(tmp_action.name);
    tmp_action.func = func;
    menu->actions_list.insert(menu->actions_list.length() + 1, tmp_action);

    return;
}

2、运行结果展示

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

免责声明:文章转载自《Qt QMenuBar和QMenu以及QAction巧妙的使用方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu12.04 安装SambaOpenfire配置过程,以及与php交互注意事项。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

R包的安装 卸载 加载 移除等

R包的安装1)有四个窗口用于使用R studio手动安装R studio,所有安装的R包将显示在右下角窗口中的包下。单击安装-˃输入R包名称-˃单击安装。2) 使用命令安装安装。packagesR包,请卸载删除。packagesR包,加载libraryR包,删除...

CSS-顶部滚动进度条

Documentbody{background-image:linear-gradient(torighttop,#f0050%,#ece50%);background-repeat:no-repeat;height:300vh;position:relative;background-size:100%calc(100%-100vh+5px);}body:...

svn常见问题汇总

要添加到版本库,必须更新工作副本中的文件。5.更新时,系统会提示您文件冲突,将工作副本中的文件与服务器中的文件进行比较“当版本管理系统更改计算机上的工作副本时”,它会尝试将您的意图写入计算机上的日志文件,因此日志文件记录可能与您的上次工作状态不一致。Subversion客户端将在提交内容之前在本地工作副本中写入日志。首先删除隐藏文件夹中tmp下的临时文件。服...

unity, 设置帧率上限

使用unity制作演示,并移除所有昂贵的特效。在真正的机器上运行仍然会导致问题。最大显示帧速率为30。默认情况下,IOS设备上统一的原始帧速率限制为30。应用targetFrameRate=60;更改为最大值60。请注意,此设置对编辑器没有影响。...

HTML5表单之input 类型- Date Pickers(日期选择器)

HTML5有几种新的输入类型用于选择日期和时间:日期:选择日期、月份、年份月份:选择月份、年份星期:选择星期和年份时间:选择时间datetime local:选择时间、日期、月份和年份datetime:选择时间、,年示例1:日期示例2:月示例3:周示例4:时间˂inputtype=“time”name=“tart_time”value=“”//示例5:dat...

开源跳板机jumpserver的安装部署和使用详细教程及踩坑经验

安装篇jumpserver需要依赖于mysql数据库,python开发工具的支持,所以需要安装一系列软件。按照提示进行所有流程的安装,安装完成之后访问http://ip:8000端口即可登录到jumpserver。因为jumpserver会在被管理的后端主机上通过此处指定的管理用户来添加指定的用户和sudo权限:配置sudo授权,用于添加sudo授权。...