千家信息网

C/C++ Qt ToolBar菜单组件的具体使用是怎样的

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,C/C++ Qt ToolBar菜单组件的具体使用是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。ToolBar工
千家信息网最后更新 2026年10月31日C/C++ Qt ToolBar菜单组件的具体使用是怎样的

C/C++ Qt ToolBar菜单组件的具体使用是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

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

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

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

#include "mainwindow.h"#include "ui_mainwindow.h"#include #include #include 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 #include #include 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 #include #include 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 #include 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/lysharkvoid 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 list = pMenu->actions();    foreach (QAction* pAction, list) delete pAction;    delete pMenu;}// 处理发送过来的信号void MainWindow::onTaskBoxContextMenuEvent(){    // this->sender()就是信号发送者 QAction    QAction *pEven = qobject_cast(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 #include #include 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;}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

菜单 文件 工具 工具栏 图标 组件 代码 顶部 信号 窗体 内容 属性 快捷键 方式 任务 分割线 功能 名字 对象 底部 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州互联网科技公司 凡科互联网科技 科技互联网公司logo 互联网高科技股票 哈尔滨新华互联网科技 哈尔滨新华互联网科技学院 剑昆互联网络科技有限公司临桂 小米互联网科技园设置 宝灵互联网科技有限公司 未来五年的互联网科技 西安小鹰速贷互联网科技有限公司 中科明德北京互联网科技 伊宁互联网科技做什么的 上海钢联属于互联网科技股吗 互联网安防科技感 广州有谷有贝互联网科技有限公司 神州科技互联网有限公司 云南互联网科技学费 恒生科技指数 中概互联网 重庆科技产业互联网有哪些 融贸通互联网科技 山东吉时兔互联网科技有限公司 互联网 科技馆 哈尔滨新华互联网科技学院 欧洲十大科技互联网公司 互联网时代科技改变生活 杭州壁岐互联网科技有限公司 高科技互联网发展前景如何 上海互联网科技园景观 恒生互联网科技趋势
0