前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C/C++ Qt ToolBar 菜单栏组件应用

C/C++ Qt ToolBar 菜单栏组件应用

原创
作者头像
微软技术分享
发布于 2022-12-23 13:05:22
发布于 2022-12-23 13:05:22
1.2K0
举报

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

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

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

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

代码语言:c++
AI代码解释
复制
#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);为其指定特殊的快捷键。

代码语言:c++
AI代码解释
复制
#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;
}

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

代码语言:c++
AI代码解释
复制
#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()事件,绑定到主窗口中,实现在窗体任意位置右击都可以弹出菜单栏,代码如下。

代码语言:c++
AI代码解释
复制
#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图标与底部文字描述,这样能显得更加清爽一些。

代码语言:c++
AI代码解释
复制
#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;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C/C++ Qt ListWidget 增加右键菜单
在上一篇博文《C/C++ Qt ListWidget 列表框组件应用》中介绍了ListWidget组件的基本使用技巧,本次将给ListWidget组件增加一个右键菜单,当用户在ListWidget组件中的任意一个子项下右键,我们让其弹出这个菜单,并根据选择提供不同的功能。
微软技术分享
2022/12/23
7890
C/C++ Qt ListWidget 增加右键菜单
C/C++ Qt TreeWidget 单层树形组件应用
TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的ListView组件使用,因为ListView每次只能显示一列数据集,而使用TableWidget组件显示多列显得不够美观,此时使用Tree组件显示单层结构是最理想的方式,本章博文将通过TreeWidget实现多字段显示,并增加一个自定义菜单,通过在指定记录上右键可弹出该菜单并对指定记录进行操作。
微软技术分享
2022/12/23
1K0
C/C++ Qt TreeWidget 单层树形组件应用
C++ Qt开发:ToolBar与MenuBar菜单组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ToolBar工具栏组件以及与之类似的MenuBar菜单栏组件的常用方法及灵活运用。
微软技术分享
2023/12/16
2.8K0
C++ Qt开发:ToolBar与MenuBar菜单组件
Qt入门系列(二)
选中mainWindow.cpp右键->在Explor中显示->粘贴进来(显示包含的目录)
用户9831583
2022/06/16
2K0
Qt入门系列(二)
【QT】Qt 窗口 (QMainWindow)
QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了一个预定义的布局。QMainWindow 包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中 各组件所处的位置:
YoungMLet
2024/07/16
3930
【QT】Qt 窗口 (QMainWindow)
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
在 PyQt5 中,菜单栏(QMenuBar)、工具栏(QToolBar)和状态栏(QStatusBar)是 QMainWindow 提供的标准控件,用于帮助用户更好地与应用程序交互。它们是桌面应用程序的常见组成部分:
半截诗
2024/10/09
1.7K0
【Python篇】PyQt5 超详细教程——由入门到精通(终篇)
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog
Arya
2024/10/31
4750
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
C++ Qt 开发:ListWidget列表框组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。
微软技术分享
2023/12/18
1.9K0
C++ Qt 开发:ListWidget列表框组件
Qt 中菜单栏 QMenuBar 与工具栏 ToolBar
QMenuBar 要添加在 QMainWindow 窗口中,同样我们要继承一份 QMainWindow 类,然后在派生的类中调用 menuBar() 来创建菜单栏(MenuBar),在菜单栏中你需要创建一个主菜单(Menu),再次在主菜单中创建子菜单(Action),这样我们就构建了一个可使用的菜单。 而工具栏一般是与菜单栏配合使用的,菜单栏有的功能在 ToolBar 下也可能会存在一份相同的功能,这是老的程序界面设计的一种风格,下面代码中主要编写了如何创建菜单、给菜单增加处理函数和快捷键功能,并用菜单来初始化一个 ToolBar。
我与梦想有个约会
2023/10/20
6710
Qt 中菜单栏 QMenuBar 与工具栏 ToolBar
C++ Qt开发:TreeWidget 树形选择组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TreeWidget树形选择组件的常用方法及灵活运用。
微软技术分享
2023/12/19
2K0
C++ Qt开发:TreeWidget 树形选择组件
QT从控件部分知识点整理
2.设置可以停靠的区域,例如:只能停靠在左和右 3.设置工具栏是否可以浮动,即工具栏要么停靠在左边,要么停靠在右边,一撒手就立刻回去了 4.设置移动:如果传入一个false,则表示该工具栏无法拖拽移动
大忽悠爱学习
2021/11/15
1.1K0
学习 QT 过程中的一些笔记
学习 QT 时候做的一些笔记 目录 目录 按钮常用控件 API QT 窗口体系 信号和槽 点击按钮关闭窗口 自定义信号和槽 当自定义信号和槽出现重载 无参信号和有参信号与槽连接 Lambda 表达式 利用 Lambda 表达式实现点击按钮关闭窗口 QMainWindow 菜单栏 工具栏 状态栏 标签控件 浮动窗口 核心部件 资源文件 对话框 话框分类: 标准对话框 其他标准对话框 界面布局 控件 按钮组 QListWidget 列表容器 按钮常用控件 API QPushButton * btn = new
HauHau
2022/01/12
1.2K0
【QT】:QMainWindow 窗口
Qt 中的菜单栏是通过 QMenuBar 这个类来实现的。一个主窗口最多只有一个菜单栏,位于主窗口顶部、主窗口标题栏下面。
IsLand1314
2025/02/18
1140
【QT】:QMainWindow 窗口
Qt 添加菜单及菜单的事件响应(完整的示例)
Qt添加菜单有两种方法,一是用代码直接手动添加,二是在Qtdesigner中在界面上直接添加。
zls365
2020/08/19
7.3K0
Qt 添加菜单及菜单的事件响应(完整的示例)
【QT】QT菜单栏、状态栏、工具栏
菜单栏包含了一个下拉菜单项的列表,这些菜单项通过QAction动作类实现。一个主窗口只能有一个菜单栏。
半生瓜的blog
2023/05/13
1.4K0
Qt创建菜单栏,工具栏,状态栏
QMainWindow允许在其上创建菜单栏,工具栏和状态栏,我们就在QMainWindow上来创建它们。直接上代码,代码中有详细的注释。
zy010101
2020/04/08
5.1K0
Qt创建菜单栏,工具栏,状态栏
PyQT5菜单和工具栏
#无特殊注明,所有案例只修改第一个案例的对应部分 主窗口: QMainWindow提供了主窗口的功能,使用它能创建一些简单的状态栏、工具栏和菜单栏。
TomatoCool
2023/07/30
2970
PyQT5菜单和工具栏
Python Qt GUI设计:菜单栏、工具栏和状态栏的使用方法(拓展篇—2)
在使用Qt Creator创建UI文件时,MainWindow主窗口,主要包含:菜单栏、工具栏、状态栏等。
不脱发的程序猿
2021/10/26
7.5K0
【QT】Qt窗口(上)
QMainWindow包含一个菜单栏Menu Bar②,多个工具栏Tool Bars③,多个浮动窗口Dock Widgets,一个状态栏Status Bar⑤和一个中心部件Central Widget④ ①是Window Title
s-little-monster
2024/10/29
940
【QT】Qt窗口(上)
Qt5-QtWidgets篇
//winLabel 你要对那个组件使用动画 geometry几何结构 QPropertyAnimation * an = new QPropertyAnimation(winLabel,”geometry”); //动画时间 an->setDuration(1000); //动画开始 an->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height())); //动画结束 an->setEndValue(QRect(winLabel->x(),winLabel->y() + 300,winLabel->width(),winLabel->height())); //动画方式 an->setEasingCurve(QEasingCurve::OutBounce); an->start();
她的店里只卖樱花
2022/10/31
1.5K0
相关推荐
C/C++ Qt ListWidget 增加右键菜单
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文