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

说明:使用四种方式实现鼠标右击界面,显示出菜单,菜单上有两个动作,选择两个动作,分别打印“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";
}

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

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

相关文章

AIConnect 综合算力服务网络:引领智能未来,创造无限可能性!

2022年11月30日&#xff0c;由OpenAI开发的大模型聊天机器人GPT-3发布&#xff0c;首个完全意义上通过图灵测试的人工智能诞生了。这一里程碑事件的启发了人们对AI技术的发展和应用。在短短两年的时间里&#xff0c;各式各样的聊天AI&#xff0c;图片生成AI&#xff0c;视频生成…

B/S版+java开发的医院绩效考核系统maven+Visual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键

B/S版java开发的医院绩效考核系统mavenVisual Studio Code 医院绩效考核管理系统 提升医疗服务质量的关键 医院绩效评价系统的建设&#xff0c;优化医院绩效管理体系&#xff0c;规范化工作目标的设计、沟通、评价与反馈&#xff0c;改进和提供医院管理人员的管理能力和成效&am…

【强训笔记】day23

NO.1 思路&#xff1a;直接计算结果&#xff0c;先计算怪物可以抗几次攻击&#xff0c;再计算勇士受到的伤害&#xff0c;如果勇士的攻击力大于等于怪物的血量&#xff0c;那么就可以击杀无数只&#xff0c;如果勇士的血量正好是受到攻击的整数倍&#xff0c;那么击杀的怪物数…

深度解刨性能测试工具Locust

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Locust安装 …

强化训练:day8(求最小公倍数、数组中的最⻓连续⼦序列、字⺟收集)

文章目录 前言1. 最小公倍数1.1 题目描述1.2 解题思路1.3 代码实现 2. 数组中的最⻓连续⼦序列2.1 题目描述2.2 解题思路2.3 代码实现 3. 字母收集3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 最小公倍数   2. 数组中的最⻓连续⼦序列   3. 字⺟收集 1. 最小公倍数…

安卓APP+TCP+服务器端

1、在.xml文件中添加权限 <uses-permission android:name"android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name"android.permission.INTERNET"/>2、修改显示界面 <?xml version"1.0" encoding"utf-8&…

二叉树专题(有关二叉树的相关学习)

二叉树 1.数概念及结构 1.1树的结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结…

Git泄露(续)

接上一篇补充 git config --global user.name " " git config --global user.email 邮箱地址 配置用户名和邮箱 git commit 使其处于交互区&#xff0c;没有使用 -m&#xff0c;默认用vim 来编辑和提交信息 输入要提交的内容&#xff0c;然后按ESC建回到命令…

RT-DETR原创改进|加入SCNet中的SCConv[CVPR2020]自校准卷积模块!

⭐⭐ RT-DETR改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ⭐⭐ 一、 论文介绍 论文链接&#xff1a;http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf 代码链接&#xff1a;https://gitcode.com/MCG-NKU/SCNet/ 文章摘要&#xff1a; CNN的最新进展主要致力于设计更…

2024年3月 电子学会 青少年等级考试机器人理论真题五级

202403 青少年等级考试机器人理论真题五级 第 1 题 下图程序运行后&#xff0c;串口监视器显示的结果是&#xff1f;&#xff08; &#xff09; A&#xff1a;0 B&#xff1a;1 C&#xff1a;3 D&#xff1a;4 第 2 题 下列选项中&#xff0c;关于74HC595移位寄存器芯片的…

更高效的数据交互实现丨 DolphinDB Arrow 插件使用教程

Apache Arrow 是一种跨语言的内存数据交换格式&#xff0c;旨在为用户提供高效的数据结构&#xff0c;以实现在不同的数据处理系统之间共享数据而无需进行复制。它由 Apache 软件基金会开发和维护&#xff0c;目前已经成为许多大型数据处理和分析框架的核心组件之一。在分布式框…

【解决】Unity Build 应用程序运行即崩溃问题

开发平台&#xff1a;Unity 2021.3.7f1c1   一、问题描述 编辑器 Build 工程结束&#xff0c;但控制台 未显示 Build completed with a result of Succeeded [时间长度] 信息。该情况下打包流程正常&#xff0c;但应用程序包打开即崩溃。   二、问题测试记录 测试1&#xf…

vulhub靶机struts2环境下的s2-032(CVE-2016-3081)(远程命令执行漏洞)

影响范围 Struts 2.3.19至2.3.20.2、2.3.21至2.3.24.1和2.3.25至2.3.28 当用户提交表单数据并验证失败时&#xff0c;后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析&#xff0c;然后重新填充到对应的表单数据中。 漏洞搭建 没有特殊要求&#xff0c;请看 (3…

为什么cca门限和tx 功率有关系

Cca是用来决定信道是否繁忙&#xff0c;好像只和收有关。 但是为什么和tx有关。 设想一下这个网路布局。 如果某个STA在决定是否发送的时候&#xff0c;是否不能只看收到的干扰多大&#xff0c;还应该“冒险”一下&#xff0c;如果自己的功率足够&#xff0c;那么就可以扛住干…

网络库-POCO介绍

1.简介 POCO C Libraries 提供一套 C 的类库用以开发基于网络的可移植的应用程序&#xff0c;它提供了许多模块&#xff0c;包括网络编程、文件系统访问、线程和并发、数据库访问、XML处理、配置管理、日志记录等功能。Poco库的设计目标是易于使用、高度可定制和可扩展。 包含…

jupyter notebook中调整图片大小

截屏 ctrl V 这个目前只能保证是截屏大小&#xff0c;改变不了&#xff0c;要么之久 把图形缩小后再截图 感觉很模糊 png文件导入 markdown 代码1 <img src"./1.png" width250 height200>markdown 代码2 <img src"./1.png" width938 height…

【Transformer-BEV编码(10)】CVPR2021 PYVA 第一个明确提到 cross-attention decoder可用于视图转BEV

论文信息 论文名&#xff1a;Projecting Your View Attentively: Monocular Road Scene Layout Estimation via Cross-view Transformation 中文&#xff1a;通过交叉视图变换&#xff08;crossview transform module&#xff09;估计单目道路场景布局 数据集&#xff1a;KITT…

【小积累】@Qualifier注解

今天在看rabbitMQ的时候需要绑定交换机和队列&#xff0c;交换机和队列都已经注入到spring容器中&#xff0c;写了一个配置类&#xff0c;使用了bean注解注入的。所以这时候绑定的时候需要使用容器中的交换机和队列&#xff0c;必须要使用Qualifier去确定是容器中的哪个bean对象…

【架构-17】通信系统架构设计理论

通信系统网络架构 1. 局域网网络架构 拓扑结构&#xff1a;星型、总线型、环型、树型。 网络架构&#xff1a;单核心架构&#xff08;结构简单&#xff0c;地理范围受限&#xff09;、双核心架构&#xff08;网络拓扑结构可靠&#xff0c;投资较单核高&#xff09;、环型架构…

《机器学习by周志华》学习笔记-决策树-01

本书中的「决策树」有时指学习方法,有时指学得的树。 1、基本流程 1.1、概念 基本流程,亦称「判定树」 决策树(decision tree),是一种常见的机器学习方法。以二分类任务为例,我们希望从给定训练数据集学得一个模型,用以对新样例进行分离。 以二分类任务为例,可看作对…