这里简单介绍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命令操作。

Qt QMenuBar和QMenu以及QAction巧妙的使用方法的更多相关文章

  1. 3dsmax不同版本 pyside qt UI 设置max窗口为父窗口的方法

    3dsmax不同版本 pyside qt widget 设置 max 窗口为父窗口的方法 前言: 3dsmax 在 2014 extension 之后开始集成 Python 和 PySide,但是在版 ...

  2. QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

    QT中获取选中的radioButton的两种方法   QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioBu ...

  3. Qt自定义sleep延时函数(巧妙的使用时间差,但这样似乎CPU满格,而不是沉睡)

    Qt不像VC++的win32/MFC编程那样,提供了现成的sleep函数可供调用.Qt把sleep函数封装在QThread类中.子线程可以调用sleep函数.但是如果用户想在主线程实现延时功能,该怎么 ...

  4. Qt之窗体透明 (三种不同的方法和效果)

    关于窗体透明,经常遇到,网上的资料倒不少,也不知道写的时候是否验证过,很多都不正确...今天就在此一一阐述!       以下各效果是利用以前写过的一个小程序作为示例进行讲解!(代码过多,贴主要部分) ...

  5. 关于Qt在子线程中使用QMessageBox的折衷方法

    Qt将所有GUI相关的处理都限制在主线程中,这么做有助于防止意想不到的访问冲突产生,但也限制了线程中某些简单的UI交互的实现,比如QMessageBox. 因为QMessageBox必须在主线程中打开 ...

  6. 转:用JS判断IE浏览器的版本(-- 很巧妙实用的方法)

    ~~在看到这篇文章之前如果让我来判断IE的版本,那么我基本上会用 navigator.userAgent去做字符串检索,现在觉得特性检测的确比较靠谱一点 今天一个项目中需要判断IE版本号,又因为 jQ ...

  7. Qt之设置QWidget背景色(QStyleOption->drawPrimitive(QStyle::PE_Widget)方法比较有趣)

    QWidget是所有用户界面对象的基类,这意味着可以用同样的方法为其它子类控件改变背景颜色. Qt中窗口背景的设置,下面介绍三种方法. 1.使用QPalette2.使用Style Sheet3.绘图事 ...

  8. Qt中纯C++项目发布为dll的方法(超详细步骤)

    众所周知,我们可以将C++项目中的类以及某些方法导出,形成 .dll 文件,以供其他程序使用,下面将说明Qt环境下的使用方法. 首先创建共享库,步骤如下: 下一步会出现类对话框等等,不用管它,直接点击 ...

  9. Qt实现软件自动更新的一种简单方法

    前言 最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种简单的方式来实现.实现效果如下: 点击"检查更新&quo ...

随机推荐

  1. 使用SimpleDateFormat验证日期格式

    Java中日期格式的验证有很多方式,这里介绍用 java.text.SimpleDateFormat 来实现时间验证的一种简单方式.首先我们要知道 SimpleDateFormat 对象有一个方法 v ...

  2. Xrdp远程连接到CentOS7系统配置

    1         服务器端配置 1.1  查询是否已经安装epel库 打开已经安装了CentOS7的主机,以root用户登录,在桌面上打开一个终端,输入命令:rpm -qa|grep epel,查询 ...

  3. Core3.0返回的Json数据大小写格式问题

    前言 测试发现,CoreWebAPI返回的Json数据,会将字段的首字母转换为小写, 经百度得,返回数据会默认驼峰命名,导致的. 随即百度, https://www.cnblogs.com/cdone ...

  4. MySQL获取上月第一天、上月最后日、本月第一天、本月最后日的方法

    直接贴SQL语句了 #上月第一天 SELECT DATE_FORMAT(DATE_SUB(CURDATE(),INTERVAL 1 MONTH),'%Y-%m-01'); #上月最后日 SELECT ...

  5. 点名小辣辣,带你入门 JMeter (。・∀・)ノ゙

    什么是 JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测 试但后来扩展到其他测试领域. 它可以用于测试静态 ...

  6. MySQL全面瓦解15:视图

    概述 很多时候,我们会有一些很复杂的数据库操作,比如整合用户的行为数据,那这些数据可能包含用户的餐饮.生活日用.充值消费.交通出行.通讯物流.交通出行.医疗保健.住房物业.运动健康... 基于此,我们 ...

  7. ipython快捷键

    IPython Notebook有两种不同的键盘输入模式(编辑模式和命令模式). 编辑模式:允许你输入代码或者文本到一个单元格(cell这里我译作单元格)内,并且单元格外面有灰色的选中框(注:Jupy ...

  8. promise引用自吕大豹

    去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被列为正式规范.作为ES6中最重要的特性之一,我们有必要掌握并理解透彻.本文将由浅到深,讲解Promise的基本 ...

  9. python实现99乘法表

    for x in range(1,10): for y in range(1,10): if x>=y: print("%d*%d=%d\t"%(y,x,x*y),end=' ...

  10. 在kotlin用jni调用c++的dll中踩的坑

    在kotlin用jni调用c++的dll中踩的坑 can't find dependents libraries 不是个有效的32位程序(或者是?????32??????) 常规检查 java 指针 ...