当前位置: 首页 > article >正文

Qt窗口控件之菜单栏QMenuBar

菜单栏QMenuBar

1. QMenuBar

Qt 中的菜单栏是通过 QMenuBar 类型来实现的,一个主控件最多只能有一个菜单栏。一个菜单栏可以添加多个菜单,一个菜单又可以添加多个菜单项。

每个菜单又都是一个 QMenu 类型,每个菜单项都是一个 QAction

QMenuBar1

2. 使用代码添加菜单和菜单项

setMenuBar()QMenuBar 类型设置为 thisMainWindow)的菜单栏,再创建几个 QMenu ,使用 QMenuBaraddMenu() 添加菜单,再创建几个 QAction ,使用 QMenuaddAction() 将菜单项挂载到对应的菜单上。另外,addSeparator() 可以在菜单项的对应位置添加分割线。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenuBar* menubar=new QMenuBar();
    this->setMenuBar(menubar);

    QMenu* menu1=new QMenu("文件");
    QMenu* menu2=new QMenu("编辑");
    QMenu* menu3=new QMenu("构建");

    menubar->addMenu(menu1);
    menubar->addMenu(menu2);
    menubar->addMenu(menu3);

    QAction* action1 =new QAction("新建文件");
    QAction* action2 =new QAction("打开文件");
    QAction* action3 =new QAction("关闭文件");

    menu1->addAction(action1);
    menu1->addSeparator();
    menu1->addAction(action2);
    menu1->addAction(action3);

}

MainWindow::~MainWindow()
{
    delete ui;
}

QMenuBar2

3. 菜单快捷设置快捷键方法

在菜单的文本中增加一个 &[字母] ,如:

QMenu* menu = new QMenu("文件(&F)");

文件 这个菜单就可以使用快捷键 Alt + F 选中。实际这种快捷键添加方法是 Windows 系统提供的,在很多 Windows 的软件中都可以使用这种方式设置或使用快捷键。

4. 菜单添加子菜单

父菜单的指针使用 addMenu() 就可以将子菜单添加进该父菜单,当鼠标悬停到子菜单上时,就会展开子菜单的菜单项:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenuBar* menubar=new QMenuBar();
    this->setMenuBar(menubar);

    QMenu* parentMenu=new QMenu("父菜单");
    QMenu* childMenu=new QMenu("子菜单");

    menubar->addMenu(parentMenu);
    parentMenu->addMenu(childMenu);

    QAction* action1 =new QAction("子菜单项1");
    QAction* action2 =new QAction("子菜单项2");
    QAction* action3 =new QAction("子菜单项3");

    childMenu->addAction(action1);
    childMenu->addAction(action2);
    childMenu->addAction(action3);

}

MainWindow::~MainWindow()
{
    delete ui;
}

QMenuBar3

5. 菜单设置图标

注意,如果菜单是长在 QMenuBar 上的(即一级菜单),图标和文字不能同时显示,设置图标的菜单会只有图标能够显示出来。但长在 QMenu 上的二级菜单是能够图标和文字都一起显示的:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenuBar* menubar=new QMenuBar();
    this->setMenuBar(menubar);

    QMenu* parentMenu=new QMenu("文件");
    parentMenu->setIcon(QIcon(":/file.png"));
    QMenu* childMenu=new QMenu("文本文件");
    childMenu->setIcon(QIcon(":/txt.png"));

    menubar->addMenu(parentMenu);
    parentMenu->addMenu(childMenu);
}

MainWindow::~MainWindow()
{
    delete ui;
}

QMenuBar4

可以看到 ”文件“ 的图标显示了但是文本消失了。

6. 菜单栏内存泄漏问题

如果 Qt 项目在创建时勾选了使用 ui 生成,那么在项目最开始就已经存在了一个菜单栏,如果我们此时使用代码新建一个 QMenuBar 并将其设置到 this 中,就会导致原有的菜单栏无法被析构释放。所以在自定义菜单栏时,最好使用:

QMenuBar menuBar = this->menuBar();

先获取原有的 QMenuBar ,再使用它更改成我们想要的效果,就可以避免内存泄漏。


http://www.kler.cn/a/598523.html

相关文章:

  • 【后端开发面试题】每日 3 题(十七)
  • 搭建简易的rtsp服务器
  • 深入理解Java对象克隆:从浅入深掌握深克隆与浅克隆
  • CMS漏洞-DeDeCMS篇
  • 【uni-app】引用公共组件
  • 新配置了一台服务器+域名共178:整个安装步骤,恢复服务
  • quartz.net条件执行
  • 供应链与生产制造L1L4级高阶流程规划框架(53页PPT)(文末有下载方式)
  • vue3 ts 注册全局组件
  • JVM 类加载器之间的层次关系,以及类加载的委托机制
  • Neo Gamma 机器人在 GTC 2025 上的突破性进展与表现分析
  • Luogu P2249 【深基13.例1】查找 --- python 3解法
  • Agent toolkits集成指南
  • 【MyDB】一个仿照MySQL的轮子项目系列文章汇总
  • 算法如何测试,如果数据量很大怎么办?
  • 缓存设计模式
  • 论文阅读笔记:Denoising Diffusion Probabilistic Models (3)
  • NWAFU 生物统计实验二 R语言版
  • 逆波兰表达式
  • 基于Vue.js的组件化开发技术与实践探索