首页 > 其他分享 >qt之QTableview右击显示菜单选项

qt之QTableview右击显示菜单选项

时间:2024-09-04 15:49:11浏览次数:13  
标签:右击 qt contextMenu row QAction QTableview include event Option

 由于上下文菜单添加的action后右击鼠标也会触发QAction的triggered信号,所以添加了事件过滤,并且安装给QMenu的实列化。(代码粘贴复制到vs即可运行)

file.h--------------------------------------------------------------------------------------------------

#include <QtWidgets/QMainWindow>
#include "ui_sortmethod.h"
#include <QTableView>
#include <QStandardItemModel>
#include <QMenu>
#include <QAction>
#include <QMessageBox>
#include <QMouseEvent>

class TableViewWithContextMenu : public QTableView {
Q_OBJECT
public:
TableViewWithContextMenu(QWidget* parent = nullptr) : QTableView(parent) {
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, &QTableView::customContextMenuRequested, this, &TableViewWithContextMenu::showContextMenu);
}
protected:
bool eventFilter(QObject* obj, QEvent* event) override {
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
// 过滤右键点击事件
if (mouseEvent->button() == Qt::RightButton) {
return true; // 拦截事件,不传递给其他处理程序
}
}
else if (event->type() == QEvent::MouseButtonDblClick) {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
// 过滤右键双击事件
if (mouseEvent->button() == Qt::RightButton) {
return true; // 拦截事件,不传递给其他处理程序
}
}
// 对于其他事件,保持默认处理
return QObject::eventFilter(obj, event);
}

private slots:
void showContextMenu(const QPoint& pos) {
QModelIndex index = indexAt(pos);
if (index.isValid()) {
QMenu contextMenu;
QAction* action1 = new QAction("Option 1", this);
QAction* action2 = new QAction("Option 2", this);
contextMenu.installEventFilter(this);

connect(action1, &QAction::triggered, this, [=]() {
// 仅在左键点击时处理
QMessageBox::information(this, "Option 1", "You selected Option 1");
});

connect(action2, &QAction::triggered, this, [=]() {
// 仅在左键点击时处理
QMessageBox::information(this, "Option 2", "You selected Option 2");
});

contextMenu.addAction(action1);
contextMenu.addAction(action2);
contextMenu.exec(mapToGlobal(pos));
}
}
};

main.h--------------------------------------------------------------------------------------------------

#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QMenu>
#include <QAction>
#include <QMessageBox>

 

int main(int argc, char* argv[]) {
QApplication app(argc, argv);

// 创建模型并填充数据
QStandardItemModel model(5, 3);
for (int row = 0; row < 5; ++row) {
for (int col = 0; col < 3; ++col) {
QStandardItem* item = new QStandardItem(QString("Item %1-%2").arg(row + 1).arg(col + 1));
model.setItem(row, col, item);
}
}

// 创建带有上下文菜单的 QTableView
TableViewWithContextMenu tableView;
tableView.setModel(&model);
tableView.show();

return app.exec();
}

标签:右击,qt,contextMenu,row,QAction,QTableview,include,event,Option
From: https://www.cnblogs.com/zwj-boy/p/18396668

相关文章

  • 2-STM32F103+ML307(中移4G Cat1)基本控制篇(自建物联网平台)-整体运行测试-Android扫
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/my.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明这节测试一......
  • Qt项目转换为VS项目
    我们使用VS的“打开本地文件夹”打开我们使用QtCreator创建的项目打开以后资源管理器内容如下图所示如果希望将Qt项目转为VS项目,需要安装下面的扩展,点击扩展-->管理扩展,然后输入qt进行搜索,安装:QtVisualStudioTools在提示下载完成以后,需要关闭VS进行扩展安装,安装过程中可......
  • 如何使用四博智联ESP32-C6开发板的Zigbee功能,将其作为MQTT+Zigbee网关来控制Zigbee多
    参考了乔帮主的:ESP32-C6开发板Zigbee功能抢先体验(MQTT+Zigbee网关+灯)DF创客社区关于ZigBee的原理和知识,这里就不重复了,网上的资料非常的丰富。乐鑫为Zigbee功能,提供了专门的SDK支持:GitHub-espressif/esp-zigbee-sdk:EspressifZigbeeSDK在ESP-IDF中,也专门提供了实例......
  • 如何在Pyqt中渲染使用svggraphicsItem的SVG字形?
    在使用PyQt构建应用程序时,有时需要在图形用户界面中渲染SVG(可缩放矢量图形)文件,特别是当你需要显示图标或自定义字体时。QGraphicsSvgItem是PyQt提供的一个类,用于在QGraphicsView或QGraphicsScene中渲染SVG图像。然而,如果你想使用SVG字形或通过编程方式生成矢量图形,QS......
  • QT项目学习
    打开QtCreator界面选择NewProject或者选择菜单栏【文件】-【新建文件或项目】菜单项弹出NewProject对话框,选择QtWidgetsApplication选择【Choose】按钮,弹出如下对话框设置项目名称和路径,按照向导进行下一步选择编译套件向导会默认添加一个继承自QMainWindow的类,可以......
  • 物联网通讯协议MQTT、NB-IOT、Zigbee、CoAP、RFID、BLUETOOTH、NFC、4G和HTTP
    物联网协议集一、按网络四层协议分类NB-IoT,LORA,WIFI,蓝牙,zigbee,4G都是物理层的,这几个都需要芯片模组支持(硬件支持)而MQTT,COAP,HTTP都是应用层协议,这些需要开发服务器,或者对接云平台厂商(软件支持)所以(MQTT,COAP,HTTP)是居于(NB-IoT,LORA,WIFI,蓝牙,zigbee,4G)的上层协议物理层中二、按需要网关来分......
  • MQTT揭秘:为什么它是物联网首选的通信协议
    MQTT协议简介概览MQTT是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、智慧城市、远程医疗、电力、石油与能源等领......
  • PyQt5
    一、介绍PyQt基于QT库的python封装,是一个图形用户界面(GUI)工具包,允许用户使用python语言创建桌面应用程序。目前,不同版本中,PyQt5是较为流行的版本,支持python2.7和python3.x。PyQt支持两种开发方式,可视化和编程化。-编程式创建界面无需多说,pip安装成功以后,有较深基础功底......
  • Qt配置Mysql环境(Mingw版本)
    前言之所以写这篇文章,是由于本人被这个环境配置搞得心态搞炸了,网上的教程层出不穷,我也坚信很多还没有配置出来的小伙伴一定是照着有些教程一步一步来的,但就是死活不行,别人就行,自己的就不行。不说废话了,直接上教程。首先要确定你的Mysql和你的Mingw的位数是对的上的,要是32......
  • Learn OpenGL In Qt之系列简介
    竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~个人主页:rainInSunny | 个人专栏:C++那些事儿、LearnOpenGLInQt文章目录传送门写在前面为什么是OpenGL和Qt能学到什么能做点什么国漫女神炫酷进度冷酷机器人传送门LearnOpenGLInQt之系列简介LearnOpe......