使用QMenu和mousePressEvent制作右键弹出菜单

news2024/11/23 12:23:07

我需要实现一个在QTextBrowser上邮件弹出菜单的效果,如下所示:

 创建QTextBrowser的子类MyTextBrowser

首先创建一个QTextBrowser的子类,MyTextBrowser,如下所示:并定义一个QMenu指针

#ifndef MYTEXTBROWSER_H
#define MYTEXTBROWSER_H

#include <QMouseEvent>
#include <QObject>
#include <QTextBrowser>
#include <QWidget>
#include <QDebug>
#include <QMenu>
#include <QAction>
#include <QMessageBox>

class MyTextBrowser : public QTextBrowser
{
    Q_OBJECT
public:
    MyTextBrowser(QWidget *parent);
    QMenu *m_menu = nullptr;

    // QWidget interface
protected:
    void mouseDoubleClickEvent(QMouseEvent *event);

    // QWidget interface
protected:
    void mousePressEvent(QMouseEvent *event);
private slots:
    void action_1_slot();
    void action_2_slot();
    void action_3_slot();

};

#endif // MYTEXTBROWSER_H

在构造函数中初始化菜单

MyTextBrowser::MyTextBrowser(QWidget *parent):QTextBrowser(parent)
{
    m_menu = new QMenu();
    QAction *a1 = new QAction("action1");
    QAction *a2 = new QAction("action2");
    QAction *a3 = new QAction("action3");

    connect(a1,&QAction::triggered,this,&MyTextBrowser::action_1_slot);
    connect(a2,&QAction::triggered,this,&MyTextBrowser::action_2_slot);
    connect(a3,&QAction::triggered,this,&MyTextBrowser::action_3_slot);

    m_menu->addAction(a1);
    m_menu->addAction(a2);
    m_menu->addAction(a3);
}

实现父类的鼠标单击事件和双击事件。

void MyTextBrowser::mouseDoubleClickEvent(QMouseEvent *event)
{
    //qDebug() << "mouseDoubleClickEvent";
    if(event->button() == Qt::LeftButton){
        this->clear();
    }
}
void MyTextBrowser::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton){
        m_menu->popup(cursor().pos());
    }
}

关于位置pos,event变量中也存有位置属性,修改代码如下所示,添加打印pos的调试函数:

void MyTextBrowser::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton){
        qDebug() << "cursor().pos() = " << cursor().pos();
        qDebug() << "event->localPos() = " << event->localPos();
        qDebug() << "event->globalPos() = " << event->globalPos();
        m_menu->popup(cursor().pos());
    }
}

 event->localPos();表示MyTextBrowser窗口的位置,例如MyTextBrowser窗口的宽高是200X200。

那么event->localPos()的取值范围就是[0,199) 到[0,199]。

event->globalPos();和cursor().pos();的返回值相同,此时在MyTextBrowser的左上角右键单击,会看到下面的输出信息。从输出结果可知event->globalPos();和cursor().pos();是相同的。

 

 

实现菜单项的相关slot

void MyTextBrowser::action_1_slot()
{
    QAction *action = (QAction*)sender();
    QMessageBox::information(this,action->text(),action->text());
}

void MyTextBrowser::action_2_slot()
{
    QAction *action = (QAction*)sender();
    QMessageBox::information(this,action->text(),action->text());
}

void MyTextBrowser::action_3_slot()
{
    QAction *action = (QAction*)sender();
    QMessageBox::information(this,action->text(),action->text());
}

将这个子类放到自己的工程中:

右键弹出如下窗口:

选择action1,弹出如下窗口:

小结 

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

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

相关文章

webpack打包处理字体图标、map4、map3、avi资源

一、字体图标资源的下载&#xff08;阿里巴巴图标库&#xff09; iconfont官网&#xff1a;https://www.iconfont.cn/ 这里你可以搜索你想要的字体图标&#xff0c;或者选择官方的图标库中查找&#xff0c;我这里就以官方的图标库为例&#xff1a; 选择几个加入购物车 点…

关于libc++_shared.so 与libstdc++、libc++的链接关系

问题点1: -lstdc 与libc_shared.so的关联; 当在makefile中引入-lstdc时&#xff0c;其意味着调用动态库libstdc.so, Note&#xff1a;动态库libstdc.so 所对应的静态库是libstdc.a; Note&#xff1a;当前测试libstdc.so来自于Android12的./prebuilts/gcc/linux-x86/host/x8…

图数据库实践 - 如何将图数据库应用于供应链管理

导读 当前&#xff0c;随着全球化的加速和供应链的复杂性增加&#xff0c;供应链风险管理已经成为企业日常运营中不可忽视的重要方面。由于自然灾害、贸易保护、供应商更迭等因素的影响&#xff0c;供应链中的任何一个环节出现问题都可能导致生产中断、物流延误、成本增加&…

结构型设计模式06-桥接模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 桥接模式 1、桥接模式模式介绍 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型模式之一…

ssm+java+mysql在线捐赠系统

本系统实现一个在线捐赠系统&#xff0c;分为用户和管理员两种用户。具体功能描述如下&#xff1a; 后台管理员模块包括&#xff1a; 1. 系统用户管理&#xff1a;此功能为超级管理员所有&#xff0c;普通管理员没有此权限&#xff0c;实现超级管理员可以对普通管理员信息的…

如和使用matlab进行求导 ,入门级教程

文章目录 问题如图所示运行结果如图代码分析完整代码完结撒花 问题如图所示 运行结果如图 代码分析 % 定义样本数量 n 500;这行代码定义了一个变量 n&#xff0c;它代表样本数量。这个变量在后面的代码中会被用到。 % 将 s 和 z 取值范围分成子区间的个数 num_intervals 40…

MySQL数据库迁移到ORACLE(持续更新)

1. 使用Oracle SQL Developer 官方 SQL Developer 23.1下载 选择Windows 64-bit with JDK 11 included安装 2.下载后解压&#xff0c;选择exe执行启动&#xff0c;启动后见图 3. 创建连接 默认支持创建Oracle连接&#xff08;见下图&#xff09;&#xff0c;第三方连接需导入…

企业微信自建应用 挂载网页步骤

打开企业微信网页端&#xff0c;并登录 企业微信 https://work.weixin.qq.com/wework_admin/frame#index 点击应用管理 再次点击 应用&#xff0c;划到自建版块&#xff0c;点击创建应用 依次添加应用信息 点击创建应用&#xff0c; 添加指定网页信息

【Android Studio】Flamingo版本 更新gradle插件(AGP) 7.+到8.+

步骤 build.gradle(module) android {namespace //adddefaultConfig {applicationId }}AndroidManifest.xml 取消package属性 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/andr…

如何设置imagedraw.draw.text的字体大小

如何设置imagedraw.draw.text的字体大小 解决方法 虽然绘制框是draw.text() 但是这个函数没有提供修改的参数 解决方法 其实在字体中已经设置了大小了&#xff0c;他是按照图像调整的&#xff0c;我就直接修改了。 参考文章

QTableWidget自定义单元格

一 自定义QTableWidget 创建一个Widget项目&#xff0c;注释掉其中的ui->setupUi(this);使用自定义的布局。 #include "widget.h" #include "ui_widget.h" #include <QTableWidget> #include <QTableWidgetItem> #include <QLineEdit&…

Vue.js中的provide和inject方法是什么,有什么区别

Vue.js中的provide和inject方法 在Vue.js中&#xff0c;provide和inject是用于父组件向子组件传递数据的一种技术。通过使用provide和inject&#xff0c;我们可以在组件树中任意层次的组件之间进行数据的传递和共享&#xff0c;从而实现复杂的数据交互和状态管理的需求。本文将…

FANUC机器人MODBUS TCP通信配置方法(示教器实物演示)

FANUC机器人MODBUS TCP通信配置方法(示教器实物演示) 机器人一侧的配置: 如下图所示,示教器上找到设置—主机通讯, 如下图所示,选择第一项TCP/IP,点击详细进入配置界面, 如下图所示,设置机器人端口1#的IP地址为192.168.1.10,子网掩码:255.255.255.0 如下图所示…

【深入理解Linux内核锁】一、内核锁的由来

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

Java Web——使用Filter实现用户登录

实验名称&#xff1a; 使用Filter实现用户登录 实验目的&#xff1a; &#xff08;1&#xff09;了解什么是Filter。 &#xff08;2&#xff09;熟悉Filter的拦截过程和接口中的方法。 &#xff08;3&#xff09;掌握第一个Filter程序的编写方法。 &#xff08;4&#xf…

华为荣获上海市技术发明一等奖!基于CANN的视频增强平台以AI技术修复历史视频

2023年5月26日&#xff0c;上海市科学技术奖励大会隆重召开&#xff0c;由上海交通大学牵头&#xff0c;中国科学院深圳先进技术研究院、咪咕视讯科技有限公司、华为技术有限公司、上海云视科技股份有限公司、上海人工智能创新中心、上海媒智科技有限公司、上海数字电视国家工程…

Oracle免费云设置Multi-factor Authentication

申请Oracle免费云账号的时候系统就强迫用户设置Multi-factor Authentication&#xff0c;我选择了OracleMobileAuthenticator作为2次认证工具。刚开始用还顺利&#xff0c;但用了一段时间后Oracle登录页面迟迟未向OracleMobileAuthenticator发送通知&#xff0c;要等非常久App才…

大模型 LLM 综述, A Survey of Large Language Models

大模型 LLM 综述, A Survey of Large Language Models 一、概述 一般认为NLP领域的大模型>10 Billion参数(也有人认为是6B、7B, 工业界用, 开始展现涌现能力); 经典大模型有GPT-3、BLOOM、Flan-T5、GPT-NeoX、OPT、GLM-130B、PaLM、LaMDA、LLaMA等; 大模型时间线, 图来自…

chatgpt赋能python:Python绘图教程:将画笔移动到绝对位置的方法

Python绘图教程&#xff1a;将画笔移动到绝对位置的方法 Python作为一门高级编程语言&#xff0c;设计初衷是让编程变得简单、易学、易用&#xff0c;且支持多种编程范式&#xff0c;其中产生了让人惊艳的绘图模块——Turtle&#xff08;海龟&#xff09;。 在这篇教程中&…

Mybatis-plus代码生成器

官网&#xff1a;MyBatis-Plus (baomidou.com) 顾名思义&#xff0c;就是它为你生成代码&#xff0c;这里可以为你生成Entity、Mapper、MapperXML、Service、controller等各个模块的代码&#xff0c;极大的提升开发效率 环境&#xff1a;mysql8.0.24、mybatis-plus3.5.3.1、spr…