ToolBar工具栏在所有窗体应用程序中都广泛被使用,使用ToolBar可以很好的规范菜单功能分类,用户可根据菜单栏来选择不同的功能,Qt中默认自带ToolBar组件,当我们以默认方式创建窗体时,ToolBar就被加入到了窗体中,一般是以QToolBar的方式存在于对象菜单栏,如下所示。

QToolBar组件在开发中我遇到了以下这些功能,基本上可以应对大部分开发需求了,这里就做一个总结。

顶部工具栏ToolBar组件的定义有多种方式,我们可以直接通过代码生成,也可以使用图形界面UI拖拽实现,但使用代码时间则更加灵活一些,ToolBar组件可以表现出多种形态.

首先来看一个简单的生成案例,如下代码中我们通过属性setAllowedAreas()可以实现将ToolBar组件放置到上下左右四个不同的方位上面.

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <iostream>
#include <QMenuBar>
#include <QToolBar> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this); // ----------------------------------------------------------
// 创建菜单栏
QMenuBar *bar = menuBar();
this->setMenuBar(bar); // 将菜单栏放入主窗口
QMenu * fileMenu = bar->addMenu("文件"); // 创建父节点 // 添加子菜单
QAction *newAction = fileMenu->addAction("新建文件"); // 设置名字
//newAction->setIcon(QIcon("://image/1.ico")); // 设置可用图标 fileMenu->addSeparator(); // 添加分割线
QAction *openAction = fileMenu->addAction("打开文件"); // 设置名字
//openAction->setIcon(QIcon("://image/2.ico")); // 设置可用图标 // ----------------------------------------------------------
//创建工具栏
QToolBar *toolBar = new QToolBar(this); // 创建工具栏
addToolBar(Qt::LeftToolBarArea,toolBar); // 设置默认停靠范围 [默认停靠左侧] toolBar->setAllowedAreas(Qt::TopToolBarArea |Qt::BottomToolBarArea); // 允许上下拖动
toolBar->setAllowedAreas(Qt::LeftToolBarArea |Qt::RightToolBarArea); // 允许左右拖动 toolBar->setFloatable(false); // 设置是否浮动
toolBar->setMovable(false); // 设置工具栏不允许移动 // 工具栏添加菜单项
toolBar->addAction(newAction);
toolBar->addSeparator();
toolBar->addAction(openAction); // By : LyShark
// https://www.cnblogs.com/lyshark
// ----------------------------------------------------------
// 绑定槽函数
connect(newAction,&QAction::triggered,this,[=](){
std::cout << "new action" << std::endl;
}); connect(openAction,&QAction::triggered,this,[=](){
std::cout << "open action" << std::endl;
});
} MainWindow::~MainWindow()
{
delete ui;
}

接着通过代码的方式实现一个顶部菜单栏,该菜单栏中可以通过SetIcon(QIcon("://image/1.ico"));指定图标,也可以使用setShortcut(Qt::CTRL | Qt::Key_C);为其指定特殊的快捷键。

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <iostream>
#include <QMenuBar>
#include <QToolBar> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this); // ----------------------------------------------------------
// 创建菜单栏
QMenuBar *bar = menuBar();
this->setMenuBar(bar); //将菜单栏放入主窗口
QMenu * fileMenu = bar->addMenu("文件"); // By : LyShark
// https://www.cnblogs.com/lyshark
// 添加子菜单
QAction *newAction = fileMenu->addAction("新建文件"); // 添加名字
newAction->setIcon(QIcon(":/image/1.ico")); // 设置ICO图标
newAction->setShortcut(Qt::CTRL | Qt::Key_A); // 设置快捷键ctrl+a fileMenu->addSeparator(); // 添加分割线 QAction *openAction = fileMenu->addAction("打开文件");
openAction->setIcon(QIcon(":/image/2.ico"));
openAction->setShortcut(Qt::CTRL | Qt::Key_C); // 设置快捷键ctrl+c // ----------------------------------------------------------
// 创建工具栏(可屏蔽掉,屏蔽掉后底部将失去控件栏位) QToolBar *toolBar = new QToolBar(this); // 创建工具栏
addToolBar(Qt::BottomToolBarArea,toolBar); // 设置默认停靠范围(停靠在底部)
toolBar->setFloatable(false); // 设置是否浮动为假
toolBar->setMovable(false); // 设置工具栏不允许移动 // 工具栏添加菜单项
toolBar->addAction(newAction); // 工具栏添加[新建文件]
toolBar->addSeparator(); // 添加分割线
toolBar->addAction(openAction); // 添加[打开文件] // ----------------------------------------------------------
// 绑定信号和槽
connect(newAction,&QAction::triggered,this,[=](){
std::cout << "new file slot" << std::endl;
}); connect(openAction,&QAction::triggered,this,[=](){
std::cout << "open file slot" << std::endl;
});
} MainWindow::~MainWindow()
{
delete ui;
}

实现顶部菜单栏二级菜单,二级顶部菜单与一级菜单完全一致,只是在一级菜单的基础上进行了延申,如下代码则是定义了一个二级菜单。

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <iostream>
#include <QMenuBar>
#include <QToolBar> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this); // ----------------------------------------------------------
// 多层菜单导航栏
QMenuBar *MainMenu = new QMenuBar(this);
this->setMenuBar(MainMenu); // 1.定义父级菜单
QMenu *EditMenu = MainMenu->addMenu("编辑"); // 1.1 定义 EditMemu 下面的子菜单
QAction *text = new QAction(EditMenu);
text->setText("编辑文件"); // 设置文本内容
text->setShortcut(Qt::CTRL | Qt::Key_A); // 设置快捷键ctrl+a
text->setIcon(QIcon(":/image/1.ico")); // 增加图标
EditMenu->addAction(text); EditMenu->addSeparator(); // 在配置模式与编辑文件之间增加虚线 QAction *option = new QAction(EditMenu);
option->setText("配置模式");
option->setIcon(QIcon(":/image/2.ico"));
EditMenu->addAction(option); // 1.1.2 定义Option配置模式下的子菜单
QMenu *childMenu = new QMenu();
QAction *set_file = new QAction(childMenu);
set_file->setText("设置文件内容");
set_file->setIcon(QIcon(":/image/3.ico")); childMenu->addAction(set_file); QAction *read_file = new QAction(childMenu);
read_file->setText("读取文件内容");
read_file->setIcon(QIcon(":/image/2.ico"));
childMenu->addAction(read_file);
// ----------------------------------------------------------
// 注册菜单到窗体中
// By : LyShark
// https://www.cnblogs.com/lyshark // 首先将childMenu注册到option中
option->setMenu(childMenu);
// 然后再将childMenu加入到EditMenu中
EditMenu->addMenu(childMenu); // ----------------------------------------------------------
// 绑定信号和槽
connect(text,&QAction::triggered,this,[=](){
std::cout << "edit file slot" << std::endl;
}); connect(set_file,&QAction::triggered,this,[=](){
std::cout << "set file slot" << std::endl;
}); connect(read_file,&QAction::triggered,this,[=](){
std::cout << "read file slot" << std::endl;
});
} MainWindow::~MainWindow()
{
delete ui;
}

Qt中的菜单还可以实现任意位置的弹出,例如我们可以将右击customContextMenuRequested()事件,绑定到主窗口中,实现在窗体任意位置右击都可以弹出菜单栏,代码如下。

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QMenuBar>
#include <iostream> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setContextMenuPolicy(Qt::CustomContextMenu);
} MainWindow::~MainWindow()
{
delete ui;
} // 在主界面右击->转到customContextMenuRequested槽
// By : LyShark
// https://www.cnblogs.com/lyshark
void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &pos)
{
// 创建菜单对象
QMenu *pMenu = new QMenu(this); QAction *pNewTask = new QAction(tr("新建"), this);
QAction *pEditTask = new QAction(tr("编辑"), this);
QAction *pDeleteTask = new QAction(tr("删除"), this); // 设置属性值编号: 1=>新建 2=>设置 3=>删除
pNewTask->setData(1);
pEditTask->setData(2);
pDeleteTask ->setData(3); // 把QAction对象添加到菜单上
pMenu->addAction(pNewTask);
pMenu->addAction(pEditTask);
pMenu->addAction(pDeleteTask); // 增加图标
pNewTask->setIcon(QIcon(":/image/1.ico"));
pEditTask->setIcon(QIcon(":/image/2.ico"));
pDeleteTask->setIcon(QIcon(":/image/3.ico")); // 连接鼠标右键点击信号
connect(pNewTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pEditTask, SIGNAL(triggered()), this, SLOT(onTaskBoxContextMenuEvent()));
connect(pDeleteTask, SIGNAL(triggered()), SLOT(onTaskBoxContextMenuEvent())); // 在鼠标右键点击的地方显示菜单
pMenu->exec(QCursor::pos()); //释放内存
QList<QAction*> list = pMenu->actions();
foreach (QAction* pAction, list) delete pAction;
delete pMenu;
} // 处理发送过来的信号
void MainWindow::onTaskBoxContextMenuEvent()
{
// this->sender()就是信号发送者 QAction
QAction *pEven = qobject_cast<QAction *>(this->sender()); // 获取编号: 1=>新建 2=>设置 3=>删除
int iType = pEven->data().toInt(); switch (iType)
{
case 1:
std::cout << "新建任务" << std::endl;
break;
case 2:
std::cout << "设置任务" << std::endl;
break;
case 3:
std::cout << "删除任务" << std::endl;
break;
default:
break;
}
}

还可以将顶部的菜单通过bar->setVisible(false);属性将其隐藏起来,对外只展示出一个ToolBar控件栏位,ToolBar控件栏中只保留ICO图标与底部文字描述,这样能显得更加清爽一些。

#include "mainwindow.h"
#include "ui_mainwindow.h" #include <QMenuBar>
#include <QToolBar>
#include <iostream> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
ui->setupUi(this); // ----------------------------------------------------------
// 隐藏菜单栏上的右击菜单
this->setContextMenuPolicy(Qt::NoContextMenu); // 创建基础顶部菜单并让其隐藏
QMenuBar *bar = menuBar();
this->setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("Ptr");
bar->setVisible(false); // 隐藏菜单 // 添加子菜单
QAction *NewAction = fileMenu->addAction("新建文件");
QAction *OpenAction = fileMenu->addAction("打开文件");
QAction *ReadAction = fileMenu->addAction("读入文件"); // 分别设置图标
NewAction->setIcon(QIcon(":/image/1.ico"));
OpenAction->setIcon(QIcon(":/image/2.ico"));
ReadAction->setIcon(QIcon(":/image/3.ico")); // 创建工具栏
QToolBar *toolBar = new QToolBar(this);
addToolBar(Qt::TopToolBarArea,toolBar); // 将菜单项依次添加到工具栏
toolBar->addAction(NewAction);
toolBar->addAction(OpenAction);
toolBar->addAction(ReadAction); // 设置禁止移动属性,工具栏默认贴在上方
toolBar->setFloatable(false);
toolBar->setMovable(false);
toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); // ----------------------------------------------------------
// 绑定槽函数
// By : LyShark
// https://www.cnblogs.com/lyshark
connect(NewAction,&QAction::triggered,this,[=](){
std::cout << "new action" << std::endl;
}); connect(OpenAction,&QAction::triggered,this,[=](){
std::cout << "open action" << std::endl;
}); connect(ReadAction,&QAction::triggered,this,[=](){
std::cout << "read action" << std::endl;
});
} MainWindow::~MainWindow()
{
delete ui;
}

C/C++ Qt ToolBar 菜单组件应用的更多相关文章

  1. Qt之股票组件-自选股--列表可以拖拽、右键常用菜单

    目录 一.开头嘴一嘴 二.效果展示 三.自选股列表 1.列表初始化 2.添加Item 3.右键菜单 4.拖拽Item 5.刷新数据 四.相关文章 原文链接:Qt之股票组件-自选股--列表可以拖拽.右键 ...

  2. 87.Ext_菜单组件_Ext.menu.Menu

    转自:https://blog.csdn.net/lms1256012967/article/details/52574921 菜单组件常用配置: /* Ext.menu.Menu主要配置项表: it ...

  3. Qt之股票组件-股票检索--支持预览框、鼠标、键盘操作

    目录 一.感慨一下 二.效果展示 三.搜索编辑框 1.编辑框 2.预览框 四.相关文章 原文链接:Qt之股票组件-股票检索--支持预览框.鼠标.键盘操作 一.感慨一下 之前做过一款炒股软件,个人觉着是 ...

  4. C/C++ Qt 基础通用组件应用

    QT 是一个跨平台C++图形界面开发库,利用QT可以快速开发跨平台窗体应用程序,在QT中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率. 目前,QT开发中常用的基础 ...

  5. Android入门(七):Spinner下拉式菜单组件

    对于手机和平板电脑的应用程序来说,打字是非常不方便的操作方式,比较好的方式就是列出一组选项让用户挑选,这样就可以避免打字的麻烦.使用Spinner下拉菜单组件需要完成以下几个步骤: 1.建立选项列表, ...

  6. 菜单组件——axure线框图部件库介绍

    软件类的教程,我写不出长篇大论,这里面的都是基础的操作,希望初学者,根据一个功能演示,可以自己测试其他功能菜单的效果! Axure自带的菜单组件,我几乎没有用到过,做菜单导航,我第一时间想到的还是矩形 ...

  7. JS列表的下拉菜单组件(仿美化控件select)

    JS列表的下拉菜单组件(仿美化控件select) 2014-01-23 23:51 by 龙恩0707, 1101 阅读, 6 评论, 收藏, 编辑 今天是农历23 也是小年,在这祝福大家新年快乐!今 ...

  8. qt之菜单项定制

    qt实现菜单,简单的界面QMenu+QAction完全可以实现,在加上qss的支持,可以定制出比较美观的菜单,qt的菜单一般用在托盘.按钮和工具栏上. 当然啦,也有很多软件有比较美观的托盘菜单,比如3 ...

  9. Delphi 之 菜单组件(TMainMenu)

    菜单组件TMainMenu 创建菜单双击TmenuMain,单击Caption就可以添加一个菜单项 菜单中添加分割线只需加“-”就可以添加一个分割线 级联菜单的设计 单击鼠标右键弹出菜单中选择Crea ...

随机推荐

  1. Linux虚拟机配置静态ip地址

    使用VMware搭建的虚拟机ip地址经常变动,在这里记录一下虚拟机设置静态ip地址: 首先通过VMware菜单栏编辑->虚拟网络编辑器->NAT设置查看子网ip地址和网关ip: 例如我这里 ...

  2. 题解「BZOJ4310」跳蚤

    题目传送门 Description 现在有一个长度为 \(n\) 的字符串,将其划分为 \(k\) 段,使得这 \(k\) 段每一段的字典序最大子串中字典序最大的字符串字典序尽量小.求出这个字符串. ...

  3. .Net Core微信服务商二次进件

    最近商城进行微信服务商二次进件的开发,大致有几个点 一,服务商签名 二,服务商证书获取 三,图片上传 四,敏感信息加密 五,查询进件状态 除此之外,就是进件信息的拼装 电商二级商户进件申请单-状态流转 ...

  4. Selenium获取动态图片验证码

    Selenium获取动态图片验证码 关于图片验证码的文章,我想大家都有一定的了解了. 在我们做UI自动化的时候,经常会遇到图片验证码的问题. 当开发不给咱们提供万能验证码,或者测试第三方网站比如知乎的 ...

  5. 【UE4 C++ 基础知识】<4> 枚举 Enum、结构体 Struct

    枚举 UENUM宏搭配BlueprintType可以将枚举暴露给蓝图,不使用的话,仅能在C++使用 //定义一个原生enum class enum class EMyType { Type1, Typ ...

  6. Java:TreeMap类小记

    Java:TreeMap类小记 对 Java 中的 TreeMap类,做一个微不足道的小小小小记 概述 前言:之前已经小小分析了一波 HashMap类.HashTable类.ConcurrentHas ...

  7. Scrum Meeting 15

    第15次例会报告 日期:2021年06月09日 会议主要内容概述: 开发工作接近尾声,接下来两天重点放在单元测试.调CSS和增加数据集数量上. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链 ...

  8. 【技术博客】在Unity3d中实现烟花效果

    在游戏开发中,我们经常需要用到类似烟花的效果.在Unity3d中,实现烟花效果的方法不止一种,我选用了Unity3d中新添加的粒子特效工具--visual effect graph来进行实现. 实现过 ...

  9. OO第二单元电梯作业总结

    目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...

  10. 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑~帶你一次看懂!

    正文字体大小:大 中 小 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑-帶你一次看懂! (2017-02-21 10:57:48) 转载▼ 标签: wi-fi速度 手機wi- ...