【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_OBJECT

public:
    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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考高级架构师:进程和线程概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

picGo图床搭建gitee和smms(建议使用)

picGoGitee 这个需要下载gitee插件, 因为官方频繁的检索文件类型, 有时候也会失效 如果没有特殊要求平时存个学习的要看图中文字的重要的图片建议就是smms, 免费也够用! 图片存本地不方便, 各种APP中来回传还会失帧损失画质, 所以你值得往下看 picGosmms 建议使用这个, sm…

idea2023+jdk1.8+Maven3.6.3+Testng6.10+junit4.13搭建测试

idea2023jdk1.8Maven3.6.3Testng6.10junit4.13搭建测试 首先创建maven工程 导入依赖 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/…

HTTP和HTTPS谁传输数据更安全?

1.HTTP HTTP在传输数据时&#xff0c;通常都是明文传输&#xff0c;也就是传输的数据没有进行加密。在这种情况下&#xff0c;如果传输的是一些敏感数据&#xff0c;比如某银行卡密码&#xff0c;就很容易被别人截获到&#xff0c;这就对我们的个人利益产生了威胁。 HTTP传输数…

Linux中JMeter的使用

Linux中JMeter的使用 Linux版本JMeter安装 # 1、下载、安装JMeter 如果有安装包直接上传即可 wget -c https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.1.tgz # 解压 tar -zxvf apache-jmeter-5.4.1.tgz -C /usr/local/sjdwz_test cd /usr/local/sjdwz_t…

【教学类-09-05】20240402细线迷宫图03+箭头图片(A4横版一页-4份横版)

作品展示 背景需求&#xff1a; 在word模板上添加“形状-箭头”&#xff0c;结果生成的图片上&#xff0c;箭头位置挪移。 思考&#xff0c;如何直接在迷宫图上添加箭头&#xff0c;以图片形式将迷宫图箭头插入docx word模板 重点说明 代码展示 批量制作细线条的迷宫图(A4横板…

上位机图像处理和嵌入式模块部署(qmacvisual获取边界点)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在图像处理中&#xff0c;解决了分割的问题之后&#xff0c;下面就是属性信息的提取。在这其中&#xff0c;有一种属性是非常重要的 &#xff0c;那…

Redis(一) redis配置 | 如何连接redis服务器 | 基本数据类型 | 基本全局命令 | 数据结构和内部编码方式

文章目录 前言Redis 配置文件连接 redis 服务器Redis 常见数据类型Redis 基本全局命令set 和 get 命令KEYS 命令EXISTS 命令DEL 命令EXPIRE 和 TTL 命令Redis 过期策略定时器和时间轮的方式实现过期key的及时删除 TYPE 命令 数据结构和编码方式 前言 本篇文章将介绍我们在 Lin…

Flume进阶学习!

本文图片来自于8.flume实时监控文件hdfs sink使用演示_哔哩哔哩_bilibili Apache Flume 的启动过程及其配置文件和脚本 在官网下载的Flume的压缩包中&#xff0c;.lib文件有大量的jar包&#xff0c;按道理说只有.lib文件就可以运行Flume程序了。只不过需要java -jar命令还要加…

android APP monkey 测试

monkey 测试 一、电脑ADB安装及使用详解1、什么是 Monkey 测试2、什么是ADB3、ADB的作用4、安装前提条件5、ADB下载6、ADB安装与配置 二、连接安卓手机检查是否连接上安卓手机windows端安装ADB驱动 三、 monkey测试操作指令演示指令APP包名查看方式测试效果 一、电脑ADB安装及使…

Golang 内存管理和垃圾回收底层原理(二)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收&#xff0c;主要注重基本底层原理讲解&#xff0c;进一步实战待后续文章 垃圾回收&#xff0c;无论是Java 还是 Golang&#xff0c;基本的逻辑都是基于 标记-清理 的&#xff0c; 标记是指标记可能需要回收的对象&#xff0c…

日记本(源码+文档)

日记本&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明功能项目截图客户端首页日记列表 书写日记个人中心设置密码锁拨打客服热线修改信息退出登录登录页输入密码锁注册页 后端管理登录页首页管理员列表管理用户管理日记列表管理日记数据 文件包含…

Spring Boot项目启动速度优化

1、配置自动配置排除列表&#xff0c;减少启动自动配置扫描&#xff0c;配置项spring.autoconfigure.exclude 2、启动类添加索引注解Indexed&#xff0c;去除启动过程中 Components 的扫描步骤&#xff0c;直接从索引文件读取。 import org.springframework.stereotype.lndexe…

基于springboot的房屋租赁系统平台

功能描述 流程&#xff1a;房主登陆系统录入房屋信息》发布租赁信息&#xff08;选择房屋&#xff09;》租客登陆系统浏览租赁信息》和房主联系、看房&#xff08;根据租赁信息单的电话线下沟通&#xff09;》房主发起签约&#xff08;生成邀请码&#xff09;》租客登陆系统根…

Qt加载.css/.qss文件设置控件的QSS样式(支持程序运行时修改且立即生效类似换肤效果)

初学Qt时要想通过QSS修改控件QWidget&#xff0c;QPushButton等原生基础控件的样式&#xff0c;一般都是直接在.ui文件中直接添加qss&#xff0c;或者在代码中通过setStyleSheet(QString qss)来设置。当程序很大时&#xff0c;很多地方需要复用样式时会非常麻烦&#xff0c;qss…

QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题

在 Python 中&#xff0c;深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;是用于创建对象副本的两种不同方式。 浅拷贝是创建一个新的对象&#xff0c;该对象与原始对象的内容相同&#xff08;包括内部嵌套对象的引用&#xff09;&…

SBCFormer:能够在单板计算机上以每秒1帧的速度进行全尺寸ImageNet分类的轻量级网络

摘要 https://arxiv.org/ftp/arxiv/papers/2311/2311.03747.pdf 计算机视觉在解决包括智能农业、渔业和畜牧业管理等不同领域的实际问题中变得越来越普遍。这些应用可能不需要每秒处理许多图像帧&#xff0c;因此从业者倾向于使用单板计算机&#xff08;SBCs&#xff09;。尽管…

Pytorch数据结构:Tensor

文章目录 Tensor基础1.1、Tensor的维度&#xff08;Dimensions&#xff09;1.1.1、举例说明1.1.2、高维Tensor 1.2、.dim()和.size()方法1.2.1、.dim()方法1.2.2、.size()方法1.2.3、.shape属性1.2.3、示例代码1.2.3.1、一维Tensor1.2.3.2、二维Tensor1.2.3.3、三维Tensor 1.3、…

【Go】十五、接口、多态、断言

文章目录 1、接口的引入2、接口3、接口的注意点4、多态5、断言6、Type Switch 1、接口的引入 以日常生活中打招呼为例&#xff0c;定义接口规范&#xff0c;各国人为打招呼为具体的实现 package main import "fmt"//接口的定义&#xff1a;定义规则、定义规范&…

存内领域前沿,基于忆阻器的存内计算----浅析忆阻存内计算

目录 一.概念浅析 二.忆阻器的分类 三.基于忆阻器的存内计算原理 四.存内计算的实验研究 一.概念浅析 1.存内计算 存内计算&#xff08;In-Memory Computing&#xff0c;简称 IMC&#xff09;是一种将数据处理和存储紧密结合在一起的计算方式。它的主要思想是在存储设备中直…