Qt之点击鼠标右键创建菜单栏使用(六)
目录
前言
一、示例演示
二、菜单栏
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文库。
相关文章:
Qt之点击鼠标右键创建菜单栏使用(六)
Qt开发 系列文章 - menu(六) 目录 前言 一、示例演示 二、菜单栏 1.MenuBar 2.Menu 总结 前言 QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menubar)、多个工具栏(toolbars)、一个状态栏(status…...
开发一套SDK 第一弹
自动安装依赖包 添加条件使能 #ex: filetypesh bash_ls 识别 达到预期,多个硬件环境 等待文件文件系统挂在完成 或者创建 /sys/class/ 属性文件灌入配置操作 AI 提供的 netlink 调试方法,也是目前主流调用方法,socket yyds #include <linux/module.h> #include <linux…...
sftp+sshpass
实现场景,要求客户端定时将本地的日志文件传输到服务器。 工作环境ubuntu,注意不通操作系统的版本不通,依赖的工具的版本也有所不同 实现目标需要客户端满足安装工具: 1、下载安装sshpass ---安装命令:sudo apt-ge…...
【机器学习与数据挖掘实战】案例01:基于支持向量回归的市财政收入分析
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...
Idea实现定时任务
定时任务 什么是定时任务? 可以自动在项目中根据设定的时长定期执行对应的操作 实现方式 Spring 3.0 版本之后自带定时任务,提供了EnableScheduling注解和Scheduled注解来实现定时任务功能。 使用SpringBoot创建定时任务非常简单,目前主要…...
Linux 安装NFS共享文件夹
程序默认使用2049端口,如果被占用需要修改端口104设置为服务端 122设置为客户端 一、在线安装(服务端和客户端执行) yum install nfs-utils rpcbind -y二、配置启动参数(服务端执行) 104服务器/mnt路径下创建shareda…...
bash 判断内存利用率是否高于60%
在 Bash 脚本中,可以通过 free 命令获取内存利用率,然后结合 awk 和条件判断语句实现监控内存利用率是否高于 60%。以下是一个示例脚本: 1. 示例脚本 #!/bin/bash# 获取总内存和已使用内存 total_mem$(free | awk /Mem:/ {print $2}) used_…...
推送(push)项目到gitlab
文章目录 1、git init1.1、在当前目录中显示隐藏文件:1.2、查看已有的远程仓库1.3、确保你的本地机器已经生成了 SSH 密钥:1.4、将生成的公钥文件(通常位于 ~/.ssh/id_rsa.pub)复制到 GitLab 的 SSH 设置中:1.5、测试 …...
centos9升级OpenSSH
需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2(根据需求进行升级) 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…...
硬件成本5元-USB串口采集电表数据完整方案-ThingsPanel快速入门
ThingsPanel开源物联网平台支持广泛的协议,灵活自由,本文介绍ThingsPanel通过串口来采集电表数据,简单易行,成本低廉,适合入门者学习试验,也适合一些特定的应用场景做数据采集。 适用场景: 降低…...
在AWS EMR上用Hive、Spark、Airflow构建一个高效的ETL程序
在AWS EMR(Elastic MapReduce)上构建一个高效的ETL程序,使用Hive作为数据仓库,Spark作为计算引擎,Airflow作为调度工具时,有几个关键的设计与实施方面需要注意。 在AWS EMR上构建高效的ETL程序,…...
前端(四)css选择器、css的三大特性
css选择器、css的三大特性 文章目录 css选择器、css的三大特性一、css介绍二、css选择器2.1 基本选择器2.2 组合选择器2.3 交集并集选择器2.4序列选择器2.5属性选择器2.6伪类选择器2.7伪元素选择器 三、css三大特性3.1 继承性3.2 层叠性3.3 优先级 一、css介绍 CSS全称为Casca…...
vscode 打开 setting.json
按下Ctrl Shift P(Windows/Linux)或Cmd Shift P(Mac)来打开命令面板。输入open settings,然后选择 Open User Settings(JSON)。打开settings.json文件 ------修改设置-----: 1、 html代码的行长度&am…...
关于网络安全攻防演化博弈的研究小议
1. 拉高视角,从宏观看网络安全攻防 伴随着信息化的发展,网络安全的问题就一直日益突出,与此同时,网络安全技术也成为研究热点,直到今日也没有停止。 从微观来看,网络安全技术研究指的是针对某项或某几项…...
【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(7)
1.问题描述: 推送通知到手机,怎么配置拉起应用指定的页面? 解决方案: 1、如果点击通知栏打开默认Ability的话, actionType可以设置为0, 同时可以在.clickAction.data中,指定待跳转的page页面…...
远程桌面防护的几种方式及优缺点分析
远程桌面登录是管理服务器最主要的方式,于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码,悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全,攻击者可以利…...
ASP.NET|日常开发中连接Sqlite数据库详解
ASP.NET|日常开发中连接Sqlite数据库详解 前言一、安装和引用相关库1.1 安装 SQLite 驱动1.2 引用命名空间 二、配置连接字符串2.1 连接字符串的基本格式 三、建立数据库连接3.1 创建连接对象并打开连接 四、执行数据库操作4.1 创建表(以简单的用户表为例…...
python的自动化seleium安装配置(包含谷歌的chromedriver)
目录 前言介绍 一、下载谷歌浏览器chromedriver (一)查看谷歌浏览器版本 (二)去官网下载谷歌驱动(chromdriver) (三)谷歌浏览器安装位置解压 (四)配置环境变量 二、pychram里下载安装selenium 三、测试selenium是否成功 前言介绍 Selenium是一个开源的自动化测试工具&…...
QT requested database does not belong to the calling thread.线程中查询数据报错
QT requested database does not belong to the calling thread.线程中查询数据报错 QString name "ttx"; QSqlQueryModel* sql_model; QString sql_comm QString("select * from dssb_moddve_loddt_tab where name%1").arg(name); sql_model->set…...
服务器一般装什么系统?
在服务器管理中,操作系统的选择是一个关键因素,它直接影响到服务器的稳定性、性能和可维护性。那么为什么有些服务器选择Linux,而不是Windows?选择合适的操作系统对服务器的性能和安全性有多么重要? 在众多操作系统中…...
导师推荐!2026年最值得用的专业AI论文写作工具
2026年AI论文写作工具已从“单点辅助”升级为智能化学术研究系统,核心评价维度涵盖文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规等关键指标。本次测评覆盖6款主流工具,测试场景包括中文与英文论文、全流程与专项功能、免费与付费版本&#x…...
Notepad2终极指南:轻量级文本编辑器的完整使用教程
Notepad2终极指南:轻量级文本编辑器的完整使用教程 【免费下载链接】notepad2 Notepad2-zufuliu is a light-weight Scintilla based text editor for Windows with syntax highlighting, code folding, auto-completion and API list for many programming languag…...
ScintillaNET:打造专业级代码编辑器的终极Windows Forms解决方案
ScintillaNET:打造专业级代码编辑器的终极Windows Forms解决方案 【免费下载链接】ScintillaNET A Windows Forms control, wrapper, and bindings for the Scintilla text editor. 项目地址: https://gitcode.com/gh_mirrors/sc/ScintillaNET ScintillaNET是…...
终极指南:VSCode Rainbow Fart如何通过Vue.js打造沉浸式编程体验
终极指南:VSCode Rainbow Fart如何通过Vue.js打造沉浸式编程体验 【免费下载链接】vscode-rainbow-fart 一个在你编程时疯狂称赞你的 VSCode 扩展插件 | An VSCode extension that keeps giving you compliment while you are coding, it will checks the keywords …...
对于对话中的用户长期兴趣建模,OpenClaw 的序列推荐方法?
关于对话系统中如何捕捉用户长期兴趣这件事,业内琢磨了挺长时间。传统的序列推荐模型,比如那些基于循环神经网络或者注意力机制的,往往更擅长处理短期的、密集的交互序列。它们像是一个敏锐的现场观察者,能立刻抓住你刚才点击了什…...
USB批量传输中ZLP的必要性:为何512字节整数倍数据包会丢失
1. USB批量传输中的ZLP到底是什么? 第一次遇到USB批量传输丢数据的问题时,我也是一头雾水。明明发送端显示数据已经成功发送,接收端却死活收不到完整数据。后来排查发现,问题出在数据包大小刚好是512字节的整数倍时。这就是我们今…...
解密GPT:从架构解析到实战应用
1. GPT架构深度拆解 第一次接触GPT模型时,我被它流畅的文本生成能力震撼到了。记得当时用GPT-2生成了一篇伪莎士比亚风格的十四行诗,连文学系的朋友都分不清真假。这种"魔法"背后,其实是精妙的架构设计在支撑。 GPT的核心是Transfo…...
告别手动复制粘贴:MeterSphere参数提取功能详解,让你的接口自动化测试效率翻倍
MeterSphere参数提取实战:构建动态接口测试链的三大高阶技巧 在持续集成环境中,接口自动化测试往往面临一个关键挑战:如何让不同接口之间实现数据动态传递?传统的手动复制粘贴不仅效率低下,更难以应对复杂业务场景。Me…...
PingFangSC跨平台字体解决方案:企业级部署与性能优化指南
PingFangSC跨平台字体解决方案:企业级部署与性能优化指南 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件,包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 在数字化转型浪潮中,企业…...
避坑指南:RK3588 SD卡刷机时FAT32转EXT4的完整流程(含工具包)
RK3588大容量镜像烧写实战:突破FAT32限制的EXT4全流程解决方案 当你在RK3588开发板上尝试烧写超过4GB的Ubuntu或Debian镜像时,是否遇到过SD卡工具报错?这不是你的操作问题,而是FAT32文件系统的天然限制。本文将带你深入理解这一技…...
