Qt之点击鼠标右键创建菜单栏使用(六)

Qt开发 系列文章 - menu(六)


目录

前言

一、示例演示

二、菜单栏

1.MenuBar

2.Menu

总结


前言

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(statusbar)及一个中心部件(centralwidget),是许多应用程序的基础。今天本文主要讲解菜单栏QMenuBar和QMenu,其中QMenu可以嵌入到菜单栏QMenuBar中,也可以作为弹出菜单使用。

QMenu是Qt框架中的一个类,用于创建和管理菜单。它提供了丰富的接口来添加菜单项、子菜单以及分隔符。QMenu不仅支持文本菜单项,还支持图标、快捷键和状态提示等功能,这些都可以通过QAction来设置。


一、示例演示

先给出本文示例效果展示,如下。

二、菜单栏

将从两个方面讲解菜单,第一个是示例演示中的MenuBar,在窗口前端添加菜单选项;第二个是在子窗口上通过鼠标点击显示菜单Menu。

1.MenuBar

  • 步骤1

新建一个Qt项目,带UI设计的,不会创建的参考本博主前面的博文,创建完后,双击打开项目。

  • 步骤2

如果如要在菜单中添加图片显示的,可参考这一步操作,如果不如要则跳过该步骤。添加图标首先是将你的图片添加到项目中,图片格式可以是ico、png等等。

在Qt界面上,选择你的项目,右键选择添加现有文件,选择你的图标目录,如下左图所示。将图标全部选中,点击打开添加。添加完后在Qt项目中会见到如下添加图标,见如下右图。

     

  • 步骤3

在Qt项目界面上,双击打开UI设计文件,在QMenuBar上添加如下功能,有主菜单和子菜单选项,自己可以按需添加,如下所示。

上面创建好的选项,在UI界面底部显示全部的内容,具体如下。

  • 步骤4

单击选中其中一个,右键进行编辑,此时可修改为中文,也可以添加步骤2所加的图标。操作完后显示如下左图。

  • 步骤5

要实现相关的按钮功能,例如,在帮助上显示版本信息,操作如下,选中项目,右键选择转到槽函数,选择triggered函数,步骤如下。

     

triggered函数代码如下(示例)。

void MainWindow::on_action_4_triggered()
{info = new QTextBrowser;info->setWindowTitle("版本信息");info->setWindowIcon(QApplication::style()->standardIcon(QStyle::StandardPixmap::SP_MessageBoxInformation));info->setText("版本14.7.0.9802\n系统词频: 630211129\n编译时间: Aug  2 2024 17:00:18");info->show();
}
  • 步骤6

上述创建好后,在UI界面左侧,主窗口类处,会有如下变量。

此时在窗口前端添加MenuBar菜单选项已操作完毕,接下面实现在子窗口上通过鼠标点击显示菜单Menu。

2.Menu

  • 步骤1

同样是打开UI设计界面,在UI界面上添加如下①②③,相应的类如下右图。

   

  • 步骤2

要实现相关函数功能,先在头文件上定义相关类,代码如下(示例):

class MainWindow : public QMainWindow
{Q_OBJECT
public:MainWindow(QWidget *parent = nullptr);~MainWindow();
private slots:void on_action_4_triggered();
protected:void InitChart();void CreateMenu(QWidget *parent);bool eventFilter(QObject *obj, QEvent *event) override;
private:Ui::MainWindow *ui;QTextBrowser *info;QChart *chart;QLineSeries *series;QMenu *menu_widget;QMenu *menu_tab;QMenu *menu_tab_2;
};
  • 步骤3

在构造函数上进行参数初始化,和注册事件过滤器、创建菜单变量,并关联到相关子窗口上,代码如下(示例)。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->toolBar->hide();InitChart();/*** 注册事件过滤器 ***/ui->widget->installEventFilter(this);ui->tab->installEventFilter(this);ui->tab_2->installEventFilter(this);/*** 创建右键菜单 ***/CreateMenu(ui->widget);CreateMenu(ui->tab);CreateMenu(ui->tab_2);
}bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{if(watched == ui->widget) {if(event->type() == QEvent::MouseMove) {QMouseEvent *pMouseEvent = (QMouseEvent*)event;// 功能函数}if(event->type() == QEvent::MouseButtonPress)menu_widget->exec(cursor().pos());  //菜单显示的位置跟随鼠标}else if (watched == ui->tab) {if(event->type() == QEvent::MouseButtonDblClick)menu_tab->exec(cursor().pos());}else if (watched == ui->tab_2) {if(event->type() == QEvent::MouseButtonDblClick)menu_tab_2->exec(cursor().pos());}return QObject::eventFilter(watched, event);
}void MainWindow::CreateMenu(QWidget *parent)
{if(parent == ui->widget) {menu_widget = new QMenu(parent);//创建右键菜单menu_widget->addAction("功能1", this, [=](){fun1();});menu_widget->addAction("功能2", this, [=](){fun2();});menu_widget->addAction("清空", this, [=](){series->clear();});menu_widget->addAction("退出", this, [=](){ui->widget->close();});menu_widget->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);""border-right:2px solid #aaaaaa; ""border-bottom:2px solid #aaaaaa;""border-left:2px solid #aaaaaa;""border-top:2px solid #aaaaaa; ""border-radius:5px;""font: 16pt ""黑体"";""selection-background-color: rgb(100, 40, 40);");}else if (parent == ui->tab) {menu_tab = new QMenu(parent);//创建右键菜单menu_tab->addAction("功能1", this, [=](){fun1();});menu_tab->addAction("功能2", this, [=](){fun2();});menu_tab->addAction("隐藏", this, [=](){ui->tab->hide();});menu_tab->addAction("退出", this, [=](){ui->tab->close();});menu_tab->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);""border-right:2px solid #aaaaaa; ""border-bottom:2px solid #aaaaaa;""border-left:2px solid #aaaaaa;""border-top:2px solid #aaaaaa; ""border-radius:5px;""font: 16pt ""黑体"";""selection-background-color: rgb(100, 40, 40);");}else if (parent == ui->tab_2) {menu_tab_2 = new QMenu(parent);//创建右键菜单menu_tab_2->addAction("功能1", this, [=](){fun1();});menu_tab_2->addAction("功能2", this, [=](){fun2();});menu_tab_2->addAction("隐藏", this, [=](){ui->tab_2->hide();});menu_tab_2->addAction("退出", this, [=](){ui->tab_2->close();});menu_tab_2->setStyleSheet("background-color: rgb(30, 30, 30);color: rgb(255, 255, 255);""border-right:2px solid #aaaaaa; ""border-bottom:2px solid #aaaaaa;""border-left:2px solid #aaaaaa;""border-top:2px solid #aaaaaa; ""border-radius:5px;""font: 16pt ""黑体"";""selection-background-color: rgb(100, 40, 40);");}
}

上述编写完毕后,软件编译运行,显示如下。


总结

博文中相应的工程代码Qt-Case.zip 利用Qt开发软件进行编的例程,为博文提供案例-CSDN文库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天猫魔盒M17/M17S_超级UI 线刷固件包-可救砖(刷机取消双勾)

在智能电视盒子的领域中,天猫魔盒 M17 以其独特魅力占据一席之地,然而,原厂设置有时难以满足进阶用户的多元需求。此刻,刷机成为开启全新体验的关键钥匙,为您的盒子注入鲜活能量。 一、卓越固件特性概览 此款精心打造的…

Elasticsearch 7.x入门学习-Spring Data Elasticsearch框架

1 Spring Data框架 Spring Data 是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce 框架和云计算数据服务。 Spring Data 可以极大的简化 JPA的写法,…

【落羽的落羽 C语言篇】一些常见的字符函数、字符串函数、内存函数

文章目录 一、字符函数1. 字符分类函数2. 字符转换函数 二、字符串函数1. strlen的使用和模拟实现使用模拟实现 2. strcpy的使用和模拟实现使用模拟实现 3. strcat的使用和模拟实现使用模拟实现 4. strcmp的使用和模拟实现使用模拟实现 5. strncpy的使用6. strncat的使用7. str…

JAVA:访问者模式(Visitor Pattern)的技术指南

1、简述 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你将操作分离到不同的对象中,而无需修改对象本身的结构。这种模式特别适合复杂对象结构中对其元素进行操作的场景。 本文将介绍访问者模式的核心概念、优缺点,并通过详细代码示例展示如何在实际应用中实现…

小米自研系统Vela全面开源:开启物联网新时代的技术革新之旅

目录 Vela系统的技术特点 1. 高性能与低功耗的完美平衡 2. 高度可扩展性与模块化设计 3. 强大的安全机制 4. 跨平台兼容性 Vela系统的应用场景 1. 智能家居领域 2. 工业物联网领域 3. 医疗健康领域 4. 智慧城市领域 Vela系统的深远影响 1. 推动物联…

Linux/CentOS编译TensorFlow

很多时候为了方便图省事,是通过pip安装TensorFlow的,然而很不幸运行的服务器不支持AVX指令,引入模块的时候会报错: The TensorFlow library was compiled to use AVX instructions, but these aren’t available on your machine.…

2021陇剑杯——流量分析

JWT简介 JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境中以一种紧凑的、URL安全的方式传递声明(Claims)。JWT通常用于身份验证、信息交换以及验证消息的完整性。JWT通过在不…

visual studio 2022 c++使用教程

介绍 c开发windows一般都是visual studio,linux一般是vscode,但vscode调试c不方便,所以很多情况都是2套代码,在windows上用vs开发方便,在转到linux。 安装 1、官网下载vs2022企业版–选择桌面开发–安装位置–安装–…

Grafana配置告警规则推送企微机器人服务器资源告警

前提 已经部署Grafana,并且dashboard接入数据 大屏编号地址:Node Exporter Full | Grafana Labs 创建企微机器人 备注:群里若有第三方外部人员不能创建 机器人创建完成,记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…

yolov7-搭建及测试

1.环境配置 参考链接,建立环境 2.YOLOv7代码下载 代码及论文地址: GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors 下载zip后解压 注意&am…

HCIA-Access V2.5_2_2_2网络通信基础_IP编址与路由

网络层数据封装 首先IP地址封装在网络层,它用于标识一台网络设备,其中IP地址分为两个部分,网络地址和主机地址,通过我们采用点分十进制的形式进行表示。 IP地址分类 对IP地址而言,它细分为五类,A,B,C,D,E,…

信号处理相关的东东(学习解惑)

信号处理相关的东东(学习解惑) 所有内容学习自知乎专栏,https://www.zhihu.com/column/xinhao,写的很好,值得反复学习 时频域分析的一些常用概念 FROM:https://zhuanlan.zhihu.com/p/35742606 1、相加性…

【cocos creator】按照行列数创建格子布局

调用 this.creatLayout(5, 5, this.boxNode, this.rootNode) //限制数量 this.creatLayout(5, 5, this.boxNode, this.rootNode, cc.v3(0, 0), 10, 10, 23) /*** 创建格子布局* param xCount 列数量* param yCount 行数量* param prefab 预制体* param root 根节点* param root…

WPF 控件

<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> WPF基础控件 按钮控件&#xff1a; Button:按钮 RepeatButton:长按按钮 RadioButton:单选按钮 数据显示控件 Te…

java中List集合小练习

题目&#xff1a;将1~100之间所有正整数存放在一个List集合中&#xff0c;并将集合索引位置时10的对象从集合中移除。 代码&#xff1a; import java.util.ArrayList; import java.util.List;public class ListTest {public ListTest(){List<Integer> listnew ArrayLis…

RK3566触摸驱动产品实战 配置设备树 I2C驱动框架(附源码)

引言&#xff1a;相信大家在学完相关驱动框架很少真正的运用在实际的产品案例中&#xff0c;对设备树以及驱动框架还是非常的陌生&#xff0c;其次就是在编写相关驱动还有完成项目任务时的一些思路的引导&#xff0c;这些都是需要补足的&#xff0c;接下来&#xff0c;我们将之…

Qt WORD/PDF(二)使用 QtPdfium库实现 PDF操作、打印等

关于QT Widget 其它文章请点击这里: QT Widget GitHub 源码: QWidgetLearningPro &#xff08;暂未更新&#xff09; 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 预览 一、简介 QtPdfium 是基于Pdfium库的一个Qt绑定。Pdfium是一个…

信息收集(dns信息收集dnsenum和路由收集traceroute)

导入 被动收集方式不容易被目标域发现 DNS信息收集 网络拓扑结构以及网络设置 服务机 路由器 kali机 查看并设置默认网关 工具 或者在系统目录下可找到dns的工具 dnsenum dnsenum -h 帮助指令 收集百度域的指令 使用字典文件破解对查找目标域进行收集 dnsmap 对自己的虚拟机…

Java设计模式 —— 【结构型模式】适配器模式(类的适配器、对象适配器、接口适配器)详解

文章目录 基本介绍一、类的适配器二、对象适配器三、接口适配器总结 基本介绍 生活中有很多例子&#xff1a; 不同国家的插座接口不同&#xff0c;需要转换器&#xff1b;家用电源220V&#xff0c;手机只接受5V充电&#xff0c;需要转换器&#xff1b;读卡器&#xff0c;拓展…

启明智显ZX7981PC:5G时代的新选择,全屋网络无缝覆盖

在这个飞速发展的5G时代&#xff0c;每一个细微的科技进步都在推动着我们的生活向更加智能、便捷的方向发展。近日&#xff0c;启明智显再次引领科技潮流&#xff0c;正式发布其最新的5G CPE产品——ZX7981PC。作为继7981PG与7981PM之后的又一次迭代升级&#xff0c;ZX7981PC凭…