29、Qt使用上下文菜单(右键菜单)

news2024/11/18 23:46:44

说明:使用四种方式实现鼠标右击界面,显示出菜单,菜单上有两个动作,选择两个动作,分别打印“111”和“222”。

界面样式如下:

一、方法1:重写鼠标事件mousePressEvent

.h中的代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void mousePressEvent(QMouseEvent *event);

private:
    void createContextMenu();

private slots:
    void onDebug1();

    void onDebug2();

private:
    Ui::MainWindow *ui;

    QMenu *m_menu;
};
#endif // MAINWINDOW_H

.cpp中的代码如下:

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
#include <QContextMenuEvent>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    createContextMenu();
}

MainWindow::~MainWindow()
{
    delete ui;
}

/** 重写鼠标事件
* @brief MainWindow::mousePressEvent
* @param event
*/
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton) //鼠标右键单击
    {
        m_menu->exec(QCursor::pos()); //显示菜单
    }
}

/** 初始化菜单
* @brief MainWindow::createContextMenu
*/
void MainWindow::createContextMenu()
{
    m_menu = new QMenu(this);

    QAction *action1 = new QAction;
    action1->setText("打印1");
    connect(action1, &QAction::triggered, this, &MainWindow::onDebug1);
    m_menu->addAction(action1);
    m_menu->addSeparator(); //分隔符

    QAction *action2 = new QAction;
    action2->setText("打印2");
    connect(action2, &QAction::triggered, this, &MainWindow::onDebug2);
    m_menu->addAction(action2);
}

/** 打印1对应的槽函数
* @brief MainWindow::onDebug1
*/
void MainWindow::onDebug1()
{
    qDebug() << "111";
}

/** 打印2对应的槽函数
* @brief MainWindow::onDebug2
*/
void MainWindow::onDebug2()
{
    qDebug() << "222";
}

二、方法2:setContextMenuPolicy(Qt::DefaultContextMenu)

setContextMenuPolicy()的参数设置为Qt::DefaultContextMenu,右击界面会触发contextMenuEvent()事件。

.h中的代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void contextMenuEvent(QContextMenuEvent *event);

private:
    void createContextMenu();

private slots:
    void onDebug1();

    void onDebug2();

private:
    Ui::MainWindow *ui;

    QMenu *m_menu;
};
#endif // MAINWINDOW_H

.cpp中的代码如下:

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
#include <QContextMenuEvent>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    createContextMenu();

    this->setContextMenuPolicy(Qt::DefaultContextMenu);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/** 上下文菜单事件
* @brief MainWindow::contextMenuEvent
* @param event
*/
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    Q_UNUSED(event);

    m_menu->exec(QCursor::pos()); //显示菜单
}

/** 初始化菜单
* @brief MainWindow::createContextMenu
*/
void MainWindow::createContextMenu()
{
    m_menu = new QMenu(this);

    QAction *action1 = new QAction;
    action1->setText("打印1");
    connect(action1, &QAction::triggered, this, &MainWindow::onDebug1);
    m_menu->addAction(action1);
    m_menu->addSeparator(); //分隔符

    QAction *action2 = new QAction;
    action2->setText("打印2");
    connect(action2, &QAction::triggered, this, &MainWindow::onDebug2);
    m_menu->addAction(action2);
}

/** 打印1对应的槽函数
* @brief MainWindow::onDebug1
*/
void MainWindow::onDebug1()
{
    qDebug() << "111";
}

/** 打印1对应的槽函数
* @brief MainWindow::onDebug2
*/
void MainWindow::onDebug2()
{
    qDebug() << "222";
}

三、方法3:setContextMenuPolicy(Qt::CustomContextMenu);

setContextMenuPolicy()的参数设置为Qt::CustomContextMenu,右击界面会发射on_XXX_customContextMenuRequested(const QPoint &pos)信号。

.h中的代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void createContextMenu();

private slots:
    void onDebug1();

    void onDebug2();

    void on_MainWindow_customContextMenuRequested(const QPoint &pos);

private:
    Ui::MainWindow *ui;

    QMenu *m_menu;
};
#endif // MAINWINDOW_H

.cpp中的代码如下:

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
#include <QContextMenuEvent>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    createContextMenu();

    this->setContextMenuPolicy(Qt::CustomContextMenu);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/** 初始化菜单
* @brief MainWindow::createContextMenu
*/
void MainWindow::createContextMenu()
{
    m_menu = new QMenu(this);

    QAction *action1 = new QAction;
    action1->setText("打印1");
    connect(action1, &QAction::triggered, this, &MainWindow::onDebug1);
    m_menu->addAction(action1);
    m_menu->addSeparator(); //分隔符

    QAction *action2 = new QAction;
    action2->setText("打印2");
    connect(action2, &QAction::triggered, this, &MainWindow::onDebug2);
    m_menu->addAction(action2);
}

/** 打印1对应的槽函数
* @brief MainWindow::onDebug1
*/
void MainWindow::onDebug1()
{
    qDebug() << "111";
}

/** 打印1对应的槽函数
* @brief MainWindow::onDebug2
*/
void MainWindow::onDebug2()
{
    qDebug() << "222";
}

/** on_类名_customContextMenuRequested
* @brief MainWindow::on_MainWindow_customContextMenuRequested
* @param pos
*/
void MainWindow::on_MainWindow_customContextMenuRequested(const QPoint &pos)
{
    QPoint gloPos = this->mapToGlobal(pos);
    m_menu->exec(gloPos);
}

四、方法4:setContextMenuPolicy(Qt::ActionsContextMenu);

setContextMenuPolicy()的参数设置为Qt::ActionsContextMenu,右击界面会将其 QWidget::actions() 显示为上下文菜单。

.h中的代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void createContextMenu();

private slots:
    void onDebug1();

    void onDebug2();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

.cpp中的代码如下:

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
#include <QContextMenuEvent>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    createContextMenu();

    this->setContextMenuPolicy(Qt::ActionsContextMenu);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/** 初始化菜单
* @brief MainWindow::createContextMenu
*/
void MainWindow::createContextMenu()
{
    QAction *action1 = new QAction;
    action1->setText("打印1");
    connect(action1, &QAction::triggered, this, &MainWindow::onDebug1);
    this->addAction(action1);
    //this->addSeparator(); //分隔符

    QAction *action2 = new QAction;
    action2->setText("打印2");
    connect(action2, &QAction::triggered, this, &MainWindow::onDebug2);
    this->addAction(action2);
}

/** 打印1对应的槽函数
* @brief MainWindow::onDebug1
*/
void MainWindow::onDebug1()
{
    qDebug() << "111";
}

/** 打印1对应的槽函数
* @brief MainWindow::onDebug2
*/
void MainWindow::onDebug2()
{
    qDebug() << "222";
}

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

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

相关文章

他因提及其他编程语言而被禁止

在Java社区提一提Kotlin&#xff0c;可能会惹来大麻烦。 想象一下&#xff0c;你把整个职业生涯都奉献给了编程&#xff0c;特别是精通某一种特定的编程语言。你写书&#xff0c;参与该语言的开发&#xff0c;围绕它构建东西&#xff0c;分享你的知识&#xff0c;然后突然间&am…

四川汇聚荣:拼多多开店流程分享

随着电商行业的蓬勃发展&#xff0c;越来趀多的创业者选择在线上平台开设店铺。其中&#xff0c;拼多多以其独特的团购模式和巨大的用户基数成为众多商家的新宠。但对于初次涉足的商家而言&#xff0c;如何正确高效地开设一家拼多多店铺&#xff0c;无疑是他们迫切需要解决的难…

[译文] 恶意代码分析:2.LNK文件伪装成证书传播RokRAT恶意软件(含无文件攻击)

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

nestJs中跨库查询

app.module.ts中配置 模块的module中 注意实体类在写的时候和数据库中的表名一样 service中使用一下

电商核心技术揭秘56:客户关系管理与忠诚度提升

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言客户关系管理&#xff08;CRM&#xff09;的重要性提升顾客体验数据驱…

【Unity Shader入门精要 第7章】基础纹理(一)

1. 纹理映射 每一张纹理可以看作拥有一个属于自己的2D坐标空间&#xff0c;其横轴用U表示&#xff0c;纵轴用V表示&#xff0c;因此也称为UV坐标空间。 UV空间的坐标范围为[0&#xff0c;0]到[1&#xff0c;1]&#xff0c;在Unity中&#xff0c;UV空间也是从左下到右上&#…

OSPF工作过程

1.OSPF的数据包 hello包——周期性的发现&#xff0c;建立以及保活邻居关系 hello时间 --- 10S 死亡时间 --- 4倍的hello时间 --- 40S RID --- 1&#xff0c;全网唯一;2&#xff0c;格式统一---- 格式要求和IP地址一样&#xff0c;由32位二进制构成&#xff0c;使用点分十进制…

【科研】常用的实验结果评价指标(2) —— MAE 是什么? !

了解MAE 提示&#xff1a;先说概念&#xff0c;后续再陆续上代码 文章目录 了解MAE前言一、MAE 基本概念1. MAE 是什么&#xff1f;2. MAE 的起源3. MAE 的计算公式 二、MAE的适用场景是什么&#xff1f;三、MAE 的劣势&#xff0c;或 不适用于那些场景或者数据&#xff1f;四、…

常见磁盘分区问题

给磁盘分区有几个主要的原因&#xff1a; 组织和管理数据&#xff1a;分区可以帮助用户更好地组织和管理数据。例如&#xff0c;你可以在一个分区上安装操作系统&#xff0c;而在另一个分区上存储个人文件。这样&#xff0c;即使操作系统崩溃或需要重新安装&#xff0c;你的个…

十二生肖Midjourney绘画大挑战:释放你的创意火花

随着AI艺术逐渐进入大众视野&#xff0c;使用Midjourney绘制十二生肖不仅能够激发我们的想象力&#xff0c;还能让我们与传统文化进行一场新式的对话。在这里&#xff0c;我们会逐一提供给你创意满满的绘画提示词&#xff0c;让你的作品别具一格。而且&#xff0c;我们还精选了…

机器学习周报第41周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 背景1.3 论文方法1.3.1 局部特征提取1.3.2 局部特征转换器 (LoFTR) 模块1.3.4 建立粗粒度匹配1.3.5 精细匹配 1.4 损失1.5 实现细节1.6 实验1.6.1 单应性估计1.6.2 相对位姿估计 二、论文代码总结 摘要 本周阅读了一篇特征匹配领域的…

【JS面试题】原型原型链

一、面试真题展示&#xff1a; 1. 如何准确判断一个变量是不是数组&#xff1f; ① 使用instanceof进行判断&#xff1a;a instanceof Array ② 使用Array.isArray()进行判断&#xff1a;Array.isArray(a) 2. 手写一个简易的jQuery&#xff0c;考虑插件和扩展性&#xff1f; …

iOS——消息传递和消息转发

消息传递&#xff08;Message Passing&#xff09;&#xff1a; 在 iOS 中&#xff0c;消息传递机制是基于 Objective-C 语言的动态性质的一种编程方式。这种机制主要涉及到两个概念&#xff1a;发送者&#xff08;即消息的发送对象&#xff09;和接收者&#xff08;即消息的接…

定时器的理论和使用

文章目录 一、定时器理论1.1定时器创建和使用 二、定时器实践2.1周期触发定时器2.2按键消抖 一、定时器理论 定时器是一种允许在特定时间间隔后或在将来的某个时间点调用回调函数的机制。对于需要周期性任务或延迟执行任务的嵌入式应用程序特别有用。 软件定时器&#xff1a; …

Linux修炼之路之yum和vim编辑器

目录 一&#xff1a;Linux软件包管理器yum 二&#xff1a;vim编辑器 vim的三种模式及互相转换 命令模式 底行模式 三&#xff1a;普通用户的sudo指令(修改信任名单) 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 一&#xff1a…

(三)Spring教程——依赖注入与控制反转

Spring框架是为了简化企业级应用开发而创建的&#xff0c;其强大之处在于对Java SE和Java EE开发进行全方位的简化&#xff0c;Spring还对常用的功能进行封装&#xff0c;可以极大地提高Java EE的开发效率。 依赖注入是Spring的核心技术之一&#xff0c;也被称为“控制反转”&a…

听说SOLIDWORKS科研版可以节约研发成本?

近几年来&#xff0c;政府越来越重视科研带动产业&#xff0c;绩效优良的产业技术研究院对于国家和地区的学术成果转化、技术创新、产业发展等具有不可忽视的促进和带动作用。研究院会承担众多新产业的基础研究工作&#xff0c;而常规的基础研究需要长期的积累&#xff0c;每个…

【C++】string|迭代器iterator|getline|find

目录 ​编辑 string 1.string与char* 的区别 2.string的使用 字符串遍历 利用迭代器遍历 范围for遍历 反向迭代器 字符串capacity 字符串插入操作 push_back函数 append函数 运算符 ​编辑 insert函数 substr函数 字符串查找函数 find函数 rfind函数 …

果蔬经营平台|基于SSM+vue的果蔬经营平台系统的设计与实现(源码+数据库+文档)

果蔬经营平台系统 目录 基于SSM&#xff0b;vue的果蔬经营平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

过滤器Filter和拦截器Interceptor实现登录校验

一.过滤器 Filter过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些登录验证的功能 1.Filter的快速入门 1.定义Filter:定义一个类&#xff0c;实现Filter接口&#xff0c;并重写其所有方法。2.配置 public class dofilter implements Filter {Override //初始化只…