【QT】setContextMenuPolicy()函数用法

在Qt中,`setContextMenuPolicy()` 是一个相当通用的方法,几乎所有的继承自 `QWidget` 或其派生类的图形用户界面控件都可以使用该方法来设置它们的上下文菜单策略。这意味着,包括但不限于以下常见的Qt GUI控件都能使用 `setContextMenuPolicy()` 来控制其右键菜单行为:

- QPushButton
- QLineEdit
- QTextEdit
- QTreeView
- QTableView
- QTableWidget
- QListWidget
- QGraphicsView
- QComboBox
- QLabel
- QMainWindow
- QMenuBar
- QToolBar
- QStatusBar
- QWidget本身及其自定义子类

通过调用 `setContextMenuPolicy(Qt::ContextMenuPolicy policy)` 函数,可以设定控件在用户右击时的行为,比如是否启用默认上下文菜单、禁用上下文菜单,或者开启自定义上下文菜单(通过 `Qt::CustomContextMenu` 策略并连接 `customContextMenuRequested(const QPoint &pos)` 信号)。

在Qt框架中,`setContextMenuPolicy()` 是一个用于设置控件上下文菜单策略的成员函数,它允许你定义当用户在某个控件上执行右键单击(即上下文菜单请求)时控件如何响应。这个函数的常见用法如下:

```cpp
void QWidget::setContextMenuPolicy(Qt::ContextMenuPolicy policy)
```

其中:
- `policy`:它是 `Qt::ContextMenuPolicy` 枚举类型的一个值,决定了控件如何处理上下文菜单事件。

以下是 `Qt::ContextMenuPolicy` 枚举类型的几个常见值及其含义:

1. **Qt::NoContextMenu**:
   禁止上下文菜单,事件不会被控件处理,可能会被其父控件处理。

2. **Qt::PreventContextMenu**:
   同样禁止上下文菜单,但与 `NoContextMenu` 不同的是,它不将事件传播给父控件,而是完全阻止任何上下文菜单的弹出。

3. **Qt::DefaultContextMenu**:
   使用控件的默认上下文菜单处理,通常是调用 `contextMenuEvent()` 函数来处理上下文菜单事件。

4. **Qt::ActionsContextMenu**:
   控件将显示其关联动作(actions)作为上下文菜单的内容,可以通过 `QWidget::addAction()` 添加的动作会被包含在这个菜单中。

5. **Qt::CustomContextMenu**:
   当用户右击控件时,控件会发出 `customContextMenuRequested(QPoint pos)` 信号,而不显示默认的菜单。开发者需要连接这个信号到一个槽函数,在槽函数中创建并显示自定义的上下文菜单。

示例代码:```cpp

// 假设有一个QWidget实例名为myWidget
myWidget->setContextMenuPolicy(Qt::CustomContextMenu); // 设置为自定义上下文菜单// 连接信号
connect(myWidget, &QWidget::customContextMenuRequested,this, &MyClass::showCustomContextMenu); // MyClass是包含此代码的类// 定义槽函数
void MyClass::showCustomContextMenu(const QPoint &pos)
{QMenu menu(this);QAction *action1 = menu.addAction("Action 1");QAction *action2 = menu.addAction("Action 2");// 连接动作的触发信号connect(action1, &QAction::triggered, this, &MyClass::onAction1Clicked);connect(action2, &QAction::triggered, this, &MyClass::onAction2Clicked);menu.exec(myWidget->mapToGlobal(pos)); // 在鼠标点击的位置显示菜单
}

通过这种方式,你可以根据不同的需求灵活地配置Qt控件的上下文菜单行为。

 

实例:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();public slots:void slotTableMenu(const QPoint &pos);      //表格右键菜单void slotActionCopy(bool checked);          //复制void slotActionSave(bool checked);          //另存为private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QDateTime>
#include <QClipboard>
#include <QFileDialog>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);connect(ui->tableWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(slotTableMenu(const QPoint&)));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::slotTableMenu(const QPoint &pos)
{QMenu menu;menu.addAction(QStringLiteral("复制"), this, SLOT(slotActionCopy(bool)));menu.addAction(QStringLiteral("另存为"), this, SLOT(slotActionSave(bool)));menu.exec(QCursor::pos());
}//复制截图到剪切板
void MainWindow::slotActionCopy(bool checked)
{QString strFile = QCoreApplication::applicationDirPath() + "\\ScreenShot\\Data_";strFile = strFile + QDateTime::currentDateTime().toString("yyyyMMddHHmmss") + ".png";QPixmap pix = QPixmap::grabWidget(ui->tableWidget);QApplication::clipboard()->setPixmap(pix);
}//截图另存为文件
void MainWindow::slotActionSave(bool checked)
{//默认保存路径为当前应用程序路径下的ScreenShot文件夹,如果没有就新建该文件夹QString strDir = QCoreApplication::applicationDirPath() + "\\ScreenShot";QDir dir(strDir);if(!dir.exists()){dir.mkdir(strDir);}QString strFile = strDir + "\\数据快照" + QDateTime::currentDateTime().toString("yyyyMMddHHmmss") + ".png";QPixmap pix = QPixmap::grabWidget(ui->tableWidget);QString fileName = QFileDialog::getSaveFileName(this,"保存图片",strFile,"PNG (*.png);;BMP (*.bmp);;JPEG (*.jpg *.jpeg)");if (!fileName.isNull()){pix.save(fileName);}
}

 图示:2bb7b10d0a584dc49a6cda23b0edab6b.png

 

 

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

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

相关文章

ssm 科研奖励申报管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 科研奖励申报管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

Python数据分析与可视化笔记 七 Numpy ndarray

多维数组对象ndarray&#xff0c;常用属性如下所示 import numpy as nparr np.array([[1,2,3],[4,5,6]]) print(arr.shape) #ndarray各维度的长度 print(arr.ndim) #ndarray的维度 print(arr.size) #ndarray中元素的个数&#xff0c;相当于各维度长度的乘积 print(arr.dtyp…

iOS问题记录 - App Store审核新政策:隐私清单 SDK签名(持续更新)

文章目录 前言开发环境问题描述问题分析1. 隐私清单 & SDK签名1.1. 隐私清单 - 数据使用声明1.2. 隐私清单 - 所用API原因描述1.3. SDK签名 2. 即将发布的第三方SDK要求 解决方案最后 前言 前段时间用Flutter开发的iOS App提交了新版本&#xff0c;结果刚过两分钟就收到了…

智慧公厕四大核心能力,赋能城市公共厕所智能化升级

公共厕所是城市基础设施中不可或缺的一部分&#xff0c;但由于传统的公共厕所在建设与规划上&#xff0c;存在一定的局限性&#xff0c;导致环境卫生差、管理难度大、使用体验不佳等问题&#xff0c;给市民带来了很多不便。而智慧公厕作为城市智能化建设的重要组成部分&#xf…

【Linux多线程】生产者消费者模型

【Linux多线程】生产者消费者模型 目录 【Linux多线程】生产者消费者模型生产者消费者模型为何要使用生产者消费者模型生产者消费者的三种关系生产者消费者模型优点基于BlockingQueue的生产者消费者模型C queue模拟阻塞队列的生产消费模型 伪唤醒情况&#xff08;多生产多消费的…

RUST使用crates.io上的依赖完整教程

1.打开crates.io 2.搜索要使用的依赖,如rand 点击包名,进入包详情页面: 添加依赖方法有两种 1.使用cargo命令 2.直接修改Cargo.toml 使用cargo命令操作如下: 在工程目录执行如下命令: cargo add rand 执行完成后如自动向Cargo.toml中添加依赖如下: 手动修改Cargo.toml是…

STM32使用USART发送数据包指令点亮板载LED灯

电路连接&#xff1a; 连接显示屏模块&#xff0c;显示屏的SCL在B10&#xff0c;SDA在B11。 程序目的&#xff1a; 发送LED_ON指令打开板载LED灯&#xff0c;发送LED_OFF关闭板载LED灯&#xff0c;与上一个博客不同&#xff0c;这个实际上是实现串口收发文本数据包。 …

前端学习<二>CSS基础——14-CSS3属性详解:Web字体

前言 开发人员可以为自已的网页指定特殊的字体&#xff08;将指定字体提前下载到站点中&#xff09;&#xff0c;无需考虑用户电脑上是否安装了此特殊字体。从此&#xff0c;把特殊字体处理成图片的方式便成为了过去。 支持程度比较好&#xff0c;甚至 IE 低版本的浏览器也能…

【手册】——mq延迟队列

目录 一、背景介绍二、思路&方案三、过程1.项目为啥用延迟队列&#xff1f;2.项目为啥用三方延迟队列&#xff1f;3.项目中为啥用rabbitmq延迟队列&#xff1f;4.rabbitmq延迟队列的安装5.rabbitmq的延迟队列配置方式5.1.exchange配置5.2.queues配置5.3.exchange和queues的…

企业招聘,应用MBTI来做人才测评招聘测评

每年的校招季都是企业争抢优秀应届毕业生人才的忙碌季。只有精准识人用人&#xff0c;才能不断为企业注入新鲜活力和青春智慧。但是随着毕业生数量越来越多&#xff0c;企业如何在招聘中精准发现自己最需要的人才&#xff0c;成为摆在人力资源部门的大难题。人才测评是各企业都…

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1&#xff09;题目描述&#xff1a; 求A^B的最后三位数表示的整数&#xff0c;A^B表示&#xff1a;A的B次方。 2&#xff09;思路&#xff1a; 一般的思路是&#xff1a;求出A的B次幂&#xff0c;再取结果的最后三位数。但是由于计算机能够表示的数字…

机器学习周报第35期

目录 一、文献阅读&#xff1a;You Only Look Once: Unified, Real-Time Object Detection1.1 摘要1.2 背景1.3 论文模型1.4 网络设计1.5 YOLO的局限性1.6 实现代码 target 7*7*30 值域为0-1 一、文献阅读&#xff1a;You Only Look Once: Unified, Real-Time Object Detection…

Redis入门到实战-第二十二弹

Redis入门到实战 Redis高可用Sentinel官网地址Redis概述虚拟机配置在主从复制环境的基础上添加Sentinel更新计划 Redis高可用Sentinel 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一…

效率工具RunFlow完全手册之基础篇

RunFlow是我们开发的一款全新的效率工具&#xff0c;本文作为RunFlow操作手册和功能演示的基础篇&#xff0c;想了解我们有哪些新特性可以阅读我们的这篇文章&#xff0c;这里就不过多赘述了&#xff0c;我们直接开始。 关键字 关键字是我们的一个核心概念&#xff0c;一个功…

【WEEK5】 【DAY4】数据库操作【中文版】

2024.3.28 Thursday 目录 2.数据库操作2.1.数据库2.1.1.新建数据库&#xff08;右键的方法&#xff09;2.1.2.查询&#xff1a;点击“查询”->“新建查询表”即可输入所需要的语句&#xff0c;点击“运行”&#xff0c;如&#xff1a; 2.2.结构化查询语句分类2.3.数据库操作…

Mac 版 IDEA 中配置 GitLab

一、安装Git 在mac终端输入Git检测指令&#xff0c;可以通过git命令查看Git是否安装过&#xff0c;如果没有则会弹出安装按钮&#xff0c;如果安装过则会输出如下信息。 WMBdeMacBook-Pro:~ WENBO$ git usage: git [--version] [--help] [-C <path>] [-c namevalue][--…

PostgreSQL到Doris的迁移技巧:实时数据同步新选择!

PostgreSQL可以说是目前比较抢手的关系型数据库了&#xff0c;除了兼具多样功能和强大性能之外&#xff0c;还具备非常优秀的可扩展性&#xff0c;更重要的是它还开源&#xff0c;能火不是没有理由的。 虽然PostgreSQL很强大&#xff0c;但是它也有短板&#xff0c;相对于专业…

Netty实现文件服务器

1.文件上传下载的常用方法 文件上传下载是一种非常常见的功能&#xff0c;特别是在web服务网站。 常用的文件上传下载协议有以下几种&#xff1a; FTP&#xff08;File Transfer Protocol&#xff09;:是一种用于在计算机间传输文件的标准网络协议。它使用客户端-服务器架构…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

2024年天津体育学院退役大学生士兵专升本专业考试报名安排

天津体育学院2024年退役大学生士兵免试专升本招生专业考试报名安排 一、报名安排 1.报名对象&#xff1a;免于参加天津市文化考试的退役大学生士兵&#xff08;已参加天津市统一报名且资格审核通过&#xff09; 2.报名时间&#xff1a;2024年4月4日9&#xff1a;00-4月5日17…