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

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

界面样式如下:

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

.h中的代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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.hqwc.cn/news/700178.html

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

相关文章

C++——超简单登录项目

程序入口文件 #include <QtWidgets/QApplication> // 包含登录页面头文件 #include "DlgLogin.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);// 程序入口// 调页面起来//DlgMain w;//w.show();// 换成登录页面DlgLogin w;w.show();return…

大数据可视化实验(四):Excel数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;excel函数应用.. 1 2&#xff09;数据透视图绘制... 3 四、总结与心得体会... 5 一、实验目的 1&#xff09;掌握函数和公式的原理 2&#xff09;掌握在单元格或编辑栏中直接输入带函数的公式…

Weblogic未授权远程代码执行漏洞 (CVE-2023-21839)

1 漏洞概述 CVE-2023-21839是一个针对Oracle WebLogic Server的远程代码执行漏洞。WebLogic是美国Oracle公司出品的一个Java应用服务器&#xff0c;用于本地和云端开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用。该漏洞源于WebLogic IIOP/T3协议存在的缺陷&…

ATA-4315高压功率放大器在高频理疗仪驱动中的应用

现代社会&#xff0c;面对生活压力、工作压力&#xff0c;再加上不良的生活习惯&#xff0c;难免身体会出现这样或那样的问题&#xff0c;随着科技的发展&#xff0c;我们除了来到医院进行具体的治疗&#xff0c;一些可以用来辅助医生进行治疗的仪器设备也越来越多的应用到了临…

JSON在线解析及格式化验证 - JSON.cn网站

JSON在线解析及格式化验证 - JSON.cn https://www.json.cn/

5月14(信息差)

&#x1f30d;字节携港大南大升级 LLaVA-NeXT&#xff1a;借 LLaMA-3 和 Qwen-1.5 脱胎换骨&#xff0c;轻松追平 GPT-4V Demo 链接&#xff1a;https://llava-next.lmms-lab.com/ &#x1f384;阿里巴巴开源的15个顶级Java项目 ✨ 欧洲在线订餐服务Takeaway.com&#xff1a…

Token 计费与计算、tiktoken介绍

Token怎么计算的&#xff1f; 每个模型都具有不同的功能和价格。价格是按照每1000个 Token 计算的。您可以将Token视为单词的组成部分&#xff0c;其中1000个Token 大约相当于750个单词。(这段文字包含35个Token) 可以看到35个颜色块 每个块都有ID 英文、中文 都会有单独的一个…

xFormers

文章目录 一、关于 xFormers二、安装 xFormers三、基准测试&#xff08;可选&#xff09;测试安装 四、使用 xFormers1、Transformers 关键概念2、Repo 地图注意力机制Feed forward mechanismsPositional embeddingResidual pathsInitializations 3、主要特征4、安装故障排除 一…

使用Docker创建verdaccio私服

verdaccio官网 1.Docker安装 这边以Ubuntu安装为例Ubuntu 安装Docker​&#xff0c;具体安装方式请根据自己电脑自行搜索。 2.下载verdaccio docker pull verdaccio/verdaccio3.运行verdaccio 运行容器&#xff1a; docker run -it -d --name verdaccio -p 4873:4873 ver…

‍♂️垃圾收集算法必看!学习指数满天星!!!

&#x1f435;看完这篇文章&#xff0c;希望你有点收获&#x1f697; 注意&#xff1a;看之前你需要对JVM有点了解。。。 首先&#xff0c;垃圾回收算法主要分有三种: 标记-清除算法 见名知意&#xff0c;标记-清除&#xff08;Mark-Sweep&#xff09;算法分为两个阶段&#…

小米打印机Mi All-in-One Inkjet Printer进行扫描

1&#xff0c;打开电脑的控制面板&#xff0c;找到打印机 2&#xff0c;&#xff0c;选择小米打印机【Mi All-in-One Inkjet Printer】&#xff1b;右键&#xff0c;选择开始扫描 3&#xff0c;可以预览&#xff0c;或者直接扫描 4&#xff0c;点击下一步&#xff0c;导入图片 …

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint&#xff1f;2. 为什么要使用 Flask Blueprint&#xff1f;3. 如何使用 Flask Blueprint&#xff1f;4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时&#xff0c;保持代码的组织结构清晰…