Qt窗口——QMenuBar

ops/2024/9/25 6:11:38/

文章目录

    • QMenuBar
    • 示例演示
    • 给菜单栏设置快捷键
    • 给菜单项设置快捷键
    • 添加子菜单
    • 添加分割线
    • 添加图标

QMenuBar

Qt中采用QMenuBar来创建菜单栏,一个主窗口,只允许有一个菜单栏,位于主窗口的顶部、主窗口标题栏下面;一个菜单栏里面有多个菜单QMenu;菜单里面有菜单项QAction

在这里插入图片描述

QAction不仅仅在菜单里使用,还在工具栏里使用,工具栏的本质,就是菜单中一些选项的“快捷方式”

image-20240917151447658

示例演示

创建一个餐单栏,添加菜单,给菜单添加菜单项

创建工程的时候选择的是QMainWindow了,因为要创建窗口

image-20240917151733556

ui界面:

image-20240917152954287

这里有一个Bug,就是在ui界面设置菜单项的时候,中文无法输入(可以通过复制粘贴),这有点麻烦

代码创建:

关于QMenuBar的创建方式:

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

如果在创建项目的时候,没有勾选自动创建ui文件,上述代码没问题;

如果勾选了自动生成ui文件,就会造成内存泄漏,因为我们这个操作会代替旧的menubar,旧的没有释放。

QMenuBar* menuBar = this->menuBar();
this->setMenuBar(menuBar);

QMenuBar* menuBar = this->menuBar();表示如果QMenuBar()存在,则直接获取;如果不存在,就创建一个新的再返回

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建菜单栏//QMenuBar* menuBar = new QMenuBar();QMenuBar* menuBar = this->menuBar();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->addAction(action2);menu1->addAction(action3);//添加信号槽connect(action1, &QAction::trigger, this, &MainWindow::handle);connect(action3, &QAction::trigger, this, &MainWindow::close);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle()
{qDebug() << "触发新建操作";
}

菜单项被点击的时候,会触发一个信号triggered,可以设置对应的槽函数,来响应操作

GIF 2024-9-17 16-51-19

给菜单栏设置快捷键

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//QMenuBar* menuBar = new QMenuBar();QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);QMenu* menu1 = new QMenu("文件(&F)");QMenu* menu2 = new QMenu("编辑(&E)");QMenu* menu3 = new QMenu("构建(&B)");QMenu* menu4 = new QMenu("调试(&D)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);menuBar->addMenu(menu4);QAction* action1 = new QAction("新建");QAction* action2 = new QAction("撤销");QAction* action3 = new QAction("构建项目");QAction* action4 = new QAction("开始调试");menu1->addAction(action1);menu2->addAction(action2);menu3->addAction(action3);menu4->addAction(action4);
}MainWindow::~MainWindow()
{delete ui;
}

这里构建的时候直接加上& 键位即可,然后就可以通过alt + 键位触发

和给QLabel设置伙伴类似

GIF 2024-9-17 17-08-36

给菜单项设置快捷键

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//QMenuBar* menuBar = new QMenuBar();QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);QMenu* menu1 = new QMenu("文件(&F)");QMenu* menu2 = new QMenu("编辑(&E)");menuBar->addMenu(menu1);menuBar->addMenu(menu2);QAction* action1 = new QAction("新建(&N)");QAction* action2 = new QAction("打开(&O)");QAction* action3 = new QAction("撤销(&Z)");menu1->addAction(action1);menu1->addAction(action2);menu2->addAction(action3);connect(action1, &QAction::triggered, this, &MainWindow::handle1);connect(action2, &QAction::triggered, this, &MainWindow::handle2);connect(action3, &QAction::triggered, this, &MainWindow::handle3);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle1()
{qDebug() << "新建";
}void MainWindow::handle2()
{qDebug() << "打开";
}void MainWindow::handle3()
{qDebug() << "撤销";
}

GIF 2024-9-17 17-17-18

添加子菜单

image-20240917172027803

QMenu也提供了addMenu,给菜单项添加子菜单

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//QMenuBar* menuBar = new QMenuBar();QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);QMenu* menu1 = new QMenu("父菜单");QMenu* menu1_1 = new QMenu("子菜单");menuBar->addMenu(menu1);menu1->addMenu(menu1_1);QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");menu1_1->addAction(action1);menu1_1->addAction(action2);
}MainWindow::~MainWindow()
{delete ui;
}

image-20240917172504228

添加分割线

如果菜单项特别多,可以通过`add分割线进行分组,让用户看的更清楚

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//QMenuBar* menuBar = new QMenuBar();QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);QMenu* menu1 = new QMenu("菜单1");QMenu* menu2 = new QMenu("菜单2");QMenu* menu3 = new QMenu("菜单3");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);QAction* action1 = new QAction("菜单项1");QAction* action2 = new QAction("菜单项2");QAction* action3 = new QAction("菜单项3");QAction* action4 = new QAction("菜单项4");menu1->addAction(action1);menu1->addAction(action2);menu1->addSeparator();  //添加分割线menu1->addAction(action3);menu1->addSeparator();menu1->addAction(action4);}MainWindow::~MainWindow()
{delete ui;
}

image-20240917173025970

添加图标

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//QMenuBar* menuBar = new QMenuBar();QMenuBar* menuBar = this->menuBar();this->setMenuBar(menuBar);QMenu* menu1 = new QMenu("菜单1");QMenu* menu2 = new QMenu("菜单2");QMenu* menu3 = new QMenu("菜单3");menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);QAction* action1 = new QAction("kun");action1->setIcon(QIcon(":/ikun.png"));QAction* action2 = new QAction("篮球");action2->setIcon(QIcon(":/ikun2.png"));menu1->addAction(action1);menu1->addAction(action2);}MainWindow::~MainWindow()
{delete ui;
}

通过qrc机制导入图像,然后再进行设置

QMenu设置图标:

  • 如果是长在QMenuBar上文字就没有了,直接显示图标
  • 如果是子菜单,都显示

image-20240917173655496


http://www.ppmy.cn/ops/115650.html

相关文章

字符串——String

目录 1:String概述 2.String注意点 3.创建String对象的二种方法 4.字符串的比较 4.1&#xff1a;号比的是什么&#xff1f; 4.1.1&#xff1a;基本数据类型&#xff08;比较的是数据值&#xff09; 4.1.2&#xff1a;引用数据类型&#xff08;比较的是地址&#xff09; …

DBeaver中如何导入excel中的大量数据

之前也让导入过大批量的excel数据&#xff0c;忘记当时怎么导入的了&#xff0c;今天又让导入&#xff0c;感觉手工导入应该是不行的&#xff0c;太费人工了&#xff0c;还是想点办法&#xff0c;于是问了文心一言&#xff0c;操作如下&#xff0c; 在DBeaver中导入Excel中的数…

Facebook隐私设置指南:如何更好地保护个人信息

在数字化时代&#xff0c;隐私保护成为了每个互联网用户面临的重要课题。Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;拥有庞大的用户基础和丰富的个人数据。因此&#xff0c;了解和管理Facebook的隐私设置对保护个人信息至关重要。本文将为您提供一份详细…

Django 对数据库的增删改查

新增 使用方法&#xff1a;类模型.objects.create 类模型 from django.db import models# Create your models here. class Car(models.Model):user models.CharField(max_length200)plate_number models.CharField(max_length20)def __str__(self):return f{self.user} -…

【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

【HarmonyOS】深入理解Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 前言 之前就Observed和ObjectLink写过一篇讲解博客【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理&#xff01; 其中就Observe监听类的使用&#xff0c;Object…

PHP如何从字符串中删除转义字符

在PHP中&#xff0c;从字符串中删除转义字符并不是一个直接的过程&#xff0c;因为“转义字符”这个概念在PHP字符串中通常指的是那些用于表示特殊字符&#xff08;如换行符\n、制表符\t、引号\或\"等&#xff09;的反斜杠&#xff08;\&#xff09;。然而&#xff0c;如果…

练习题 - Django 4.x Models Meta 元数据选项

在 Django 中&#xff0c;Meta 类是模型定义的一部分&#xff0c;用于配置模型的各种行为特性。通过使用 Meta 元数据选项&#xff0c;开发者可以控制模型的排序、权限、数据库表名等属性&#xff0c;提供了灵活性和定制化。在实际的 web 应用开发中&#xff0c;合理配置 Meta …

Android线程使用总结

Android线程使用总结 1. Threading Performance 在程序开发的实践当中&#xff0c;为了让程序表现得更加流畅&#xff0c;我们肯定会需要使用到多线程来提升程序的并发执行性能。但是编写多线程并发的代码一直以来都是一个相对棘手的问题&#xff0c;所以想要获得更佳的程序性…