qt QMenu详解

1、概述

QMenu是Qt框架中的一个类,用于创建和管理菜单。它提供了丰富的接口来添加菜单项(通常是QAction对象)、子菜单以及分隔符。QMenu可以嵌入到菜单栏(QMenuBar)中,也可以作为弹出菜单(通过调用exec()方法)使用。QMenu支持嵌套菜单,即菜单项本身可以是一个子菜单,从而创建出复杂的菜单结构。

QMenu不仅支持文本菜单项,还支持图标、快捷键和状态提示等功能,这些都可以通过QAction来设置。此外,QMenu还提供了对菜单项可见性、启用/禁用状态以及检查状态(checkable)的细粒度控制。

2、重要方法
  • addAction(QAction *action):向菜单中添加一个动作。
  • addMenu(QMenu *menu):向菜单中添加一个子菜单。
  • addSeparator():在菜单中添加一个分隔符。
  • clear():清除菜单中的所有项。
  • exec(const QPoint &pos = QPoint()):在指定位置显示菜单作为弹出菜单,并返回用户选择的动作的索引(或-1如果没有选择)。
  • setDefaultAction(QAction *action):设置菜单的默认动作,当用户按下回车键时触发。
  • setTitle(const QString &title):设置菜单的标题。
  • actions():返回菜单中所有动作的列表。

3、重要信号
  • triggered(QAction *action):当菜单中的某个动作被触发时发出此信号。
  • aboutToShow():在菜单即将显示之前发出此信号,可以用于动态调整菜单项。
  • aboutToHide():在菜单即将隐藏之前发出此信号。

需要注意的是,QMenu本身并不直接处理用户输入,而是通过QAction来响应动作。因此,大多数与QMenu交互的信号和槽都是通过QAction来实现的。

#include <QApplication>  
#include <QMainWindow>  
#include <QMenuBar>  
#include <QMenu>  
#include <QAction>  
#include <QMessageBox>  class MainWindow : public QMainWindow {  Q_OBJECT  public:  MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {  // 创建菜单栏  QMenuBar *menuBar = this->menuBar();  // 创建文件菜单  QMenu *fileMenu = menuBar->addMenu(tr("&File"));  // 创建动作  QAction *newAction = new QAction(tr("&New"), this);  newAction->setIcon(QIcon(":/icons/new.png"));  newAction->setStatusTip(tr("Create a new file"));  connect(newAction, &QAction::triggered, this, &MainWindow::onNewFile);  QAction *openAction = new QAction(tr("&Open..."), this);  openAction->setIcon(QIcon(":/icons/open.png"));  openAction->setStatusTip(tr("Open an existing file"));  connect(openAction, &QAction::triggered, this, &MainWindow::onOpenFile);  // 将动作添加到文件菜单  fileMenu->addAction(newAction);  fileMenu->addAction(openAction);  // 创建一个弹出菜单  QMenu *popupMenu = new QMenu(this);  QAction *exitAction = new QAction(tr("E&xit"), this);  exitAction->setStatusTip(tr("Exit the application"));  connect(exitAction, &QAction::triggered, qApp, &QApplication::quit);  popupMenu->addAction(exitAction);  QPushButton *btn = new QPushButton(this);setCentralWidget(btn);connect(btn, &QPushButton::clicked, this, [&, btn, popupMenu]{popupMenu->exec(btn->mapToGlobal(btn->rect().center()));});}  private slots:  void onNewFile() {  QMessageBox::information(this, tr("New File"), tr("Create a new file..."));  }  void onOpenFile() {  QMessageBox::information(this, tr("Open File"), tr("Open an existing file..."));  }  
};  int main(int argc, char *argv[]) {  QApplication app(argc, argv); MainWindow window;  window.show();  return app.exec();  
} 

觉得有帮助的话,打赏一下呗。。

           

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

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

相关文章

倍增 st表 RMQ问题

本章我们来谈谈&#xff0c;倍增 && st表 && RMQ问题。 倍增 倍增即成倍增长。是指我们在进行递推时&#xff0c;如果状态空间很大&#xff0c;线性递推无法满足时空要求&#xff0c;此时可以考虑成倍增长的方式&#xff0c;只递推状态空间在2的整数次幂位置上…

51单片机应用开发(进阶)---定时器应用(电子秒表)

实现目标 1、巩固定时器的配置流程&#xff1b; 2、掌握按键、数码管与定时器配合使用&#xff1b; 3、秒表具体实现&#xff1a;&#xff08;1&#xff09;按K1开始计时&#xff0c;再按K1暂停计时.......&#xff1b;&#xff08;2&#xff09;按K2计时清零&#xff1b;&a…

Kubernetes (K8S)讲解存储/网络/运维

一、K8S 基本概念 1.1 什么是 Kubernetes&#xff08;K8S&#xff09;&#xff1f; Kubernetes&#xff08;通常缩写为 K8S&#xff09;是一个开源的容器编排平台&#xff0c;旨在自动化容器化应用程序的部署、扩展和管理。K8S 提供了高可用性、弹性扩展以及简化的运维操作&a…

mac 安装 nodemon

在 Mac 上安装 nodemon 有两种主要方法 全局安装 1. 前提条件 确保你已经安装了 Node.js 和 npm。你可以在终端中输入 node -v 和 npm -v 来检查是否已经安装以及查看它们的版本号。 2. 使用命令安装 打开终端&#xff0c;输入以下命令来全局安装 nodemon sudo npm insta…

吴恩达深度学习笔记(11)13.

人脸检校&#xff1a;输入某人的照片以及姓名或ID&#xff0c;判断是不是他所说的那个人 人脸识别&#xff1a; 单样本学习&#xff1a; 大多数人脸识别的问题需要在样本中只有一张照片的情况下认出一个人。 相似性函数&#xff1a;利用神经网络训练一个函数&#xff0c;可…

.Net C# 基于EFCore的DBFirst和CodeFirst

DBFirst和CodeFirst 1 概念介绍 1.1 DBFirst&#xff08;数据库优先&#xff09; 含义&#xff1a;这种模式是先创建数据库架构&#xff0c;包括表、视图、存储过程等数据库对象。然后通过实体框架&#xff08;Entity Framework&#xff09;等工具&#xff0c;根据已有的数据…

链表详解(三)

目录 链表功能实现链表的查找SLNode* SLFind(SLNode* phead, SLNDataType x)代码 链表任意位置前插入void SLInsert(SLNode**pphead&#xff0c;SLNode* pos, SLNDataType x)代码 链表任意位置前删除void SLErase(SLNode**pphead&#xff0c;SLNode* pos)代码 链表任意位置后插…

《C#语法一篇通》,20万字,48小时阅读,持续完善中。。。

本文摘录了C#语法的主要内容&#xff0c;接近20万字。 所有鸡汤的味道都等于马尿&#xff01; 如果你相信任何所谓的鸡汤文章&#xff0c;智商堪忧。 计算机语言没有”好不好“之说&#xff0c;骗子才会告诉你哪个语言好&#xff0c;学好任何一本基础语言&#xff08;C&#…

HarmonyOS开发 - 餐饮APP中多门店多窗口打开实例补充

specified启动模式为指定实例模式&#xff0c;有一些特殊场景&#xff0c;例如多门店应用中每次打开一个门店都希望能新建一个门店实例&#xff0c;而重复打开同一个门店都是同一门店实例。 此篇为餐饮APP中多门店实例的补充内容&#xff0c;以解决同一门店多次点击重复创建新窗…

Lammps动态删除反应产物分子的方法

大家好,我是小马老师。 本文介绍lammps反应势模拟过程中动态删除产物分子的方法。 lammps reaxff反应势可以模拟分子间的化学反应,fix reaxff/species命令可以输出反应过程中的产物信息。 在2022之后的lammps版本中,这个命令新增了delete关键词,使用这个命令,可以动态删除…

【Redis问题】(error) NOAUTH Authentication required.解决方法

问题描述&#xff1a; “(error) NOAUTH Authentication required”&#xff0c;通过ping方法和redis打招呼发现不成功&#xff0c;意思是没有这个权限&#xff08;也就是没有密码&#xff09; 问题解决1&#xff1a; 在命令后面加上密码&#xff08;一般情况下&#xff0c;在…

css 在 hover 子元素时,不要让父元素触发 hover 效果

别人写的没看到一个能好用的&#xff0c;虽然功能简单&#xff0c;但是这个应该还是比较陌生的 希望帮到你&#xff0c;能帮我点个赞 废话不多书&#xff0c;直接出代码 <div class"parent"><div class"child">悬停我</div></div&g…

关于自动化测试用例失败重试的一些思考

自动化测试用例失败重跑有助于提高自动化用例的稳定性&#xff0c;那我们来看一下&#xff0c;python和java生态里都有哪些具体做法&#xff1f; 怎么做 如果是在python生态里&#xff0c;用pytest做测试驱动&#xff0c;那么可以通过pytest的插件pytest-rerunfailures来实现…

Vue Router进阶详解

导航守卫 若依框架登录鉴权详解&#xff08;动态路由&#xff09;_若依鉴权-CSDN博客 完整的导航解析流程 导航被触发&#xff1a; 当用户点击页面中的链接、使用编程式导航&#xff08;如router.push或router.replace&#xff09;或手动输入URL时&#xff0c;导航流程被触发。…

如何把子组件的v-model修改数据,进行接收然后定义数据格式,子传父的实现

在 Vue 中&#xff0c;实现子组件通过 v-model 向父组件传递数据并接收后进行格式化&#xff0c;可以按照以下步骤来封装和实现&#xff1a; 步骤 1: 子组件实现 v-model 子组件需要定义一个 props 来接收 v-model 的值&#xff0c;并通过 emit 方法发出更新事件。 <!-- …

Rust 力扣 - 1984. 学生分数的最小差值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 原数组 nums 排序&#xff0c;遍历nums中下标为[0, nums.len() - k]的学生分数 假设当前遍历的下标为i则&#xff0c;以 i 下标为最小值的学生分数的最小差值为nums[i k - 1] - nums[i] 取最小差值的最小值即…

distrobox install in ubuntu 22.04 / 在 ubuntu 22.04 上安装 distrobox (***) OK

要点&#xff1a; 本测试实验&#xff0c;采用的是 podman distrobox 在沙盒 snap 中&#xff0c;安装 distrobox 需要使用 --devmode 开发模式&#xff1b;可以避开 distrobox 的版本检查&#xff1f; distrobox 官方文档显示&#xff0c; Installation https://distrobox.i…

【k8s】-运维技巧-1

文章目录 k8s-节点驱逐节点驱逐节点删除批量删除镜像k8sdockerdocker 删除缓存k8s异常Pod清理删除所有命名空间下非Running状态的 Pod强制删除所有命名空间下非Running状态的 Podk8s-节点驱逐 节点驱逐 kubectl cordon k8s-node1 kubectl drain k8s-node1 --delete-local-dat…

开源数据库 - mysql - 基于GTID的主备部署

GTID AUTO_POSITION MODE的主从 搭建主从模式 注意&#xff0c;主备库必须开启GTID并设置好server_id&#xff1a; enforce_gtid_consistency ON # 开启强制GTID一致性&#xff0c;防止非GTID事务复制 gtid_mode ON # 开启GTID server_id 9910 # 主主或者主从配置必须不一…

IA应用加速,让电子供应链更智能高效

在当今数字化浪潮中&#xff0c;电子产品制造行业正经历着前所未有的变革。越来越多的企业开展全球化业务&#xff0c;进行数字化转型&#xff0c;对于网络时延的需求也更高。 客户背景 客户专注于为中小微电子产品制造企业提供产品技术方案开发、电子元器件采购、PCBA生产制造…