重写QTableView类解决鼠标右击、单击、双击问题(附使用方法)

news/2024/10/30 17:22:39/

目录

一.重写响应事件

1.区分单击和右击

如何使用

2.区分单击和双击

3.其他修改

二.eventFilter截获事件(待验证)


界面上的QTableView在点击右键想出现右键事件的时候,同时把单击对应的槽函数执行了一遍,所以需要处理做一下区分;

也就是说QTableView不区分单机右击,双击的效果和两次右击效果相同。

有两种处理方法

一是重写其事件响应函数;(自下而上)

二是用eventFilter截获其事件,然后增加处理程序。(自上而下)

一.重写响应事件

1.区分单击和右击

TableView.cpp代码:

TableView::TableView(QWidget *parent) : QTableView(parent)
{}void TableView::mousePressEvent(QMouseEvent *event)
{setCurrentIndex(QModelIndex());//对当前索引的初始化,否则点击无效区域时会记录上一次的有效值QTableView::mousePressEvent(event);QModelIndex index = currentIndex();if (index.row() < 0 && index.column() < 0)//如果点击表格空白处直接返回return;if (event->button() == Qt::LeftButton)//鼠标左键{emit leftClicked(index);}else//鼠标右键emit rightClicked(index);}

TableView.h

//实现tableview右击左击分离
#include <QtWidgets>class TableView : public QTableView
{Q_OBJECTpublic:TableView(QWidget *parent = 0);//~TableView();signals:void leftClicked(const QModelIndex &);//点击左键信号void rightClicked(const QModelIndex &);//点击右键信号protected:void mousePressEvent(QMouseEvent *event);//函数重写
};

如何使用

1. 代码实现的qtableview:代码中已经继承Qtableviewm,使用时候只需要new TableView 即可

QTableView* viewID = new QTableView;//QT自带类,不能区分单击右击
connect(viewID, SIGNAL(clicked(const QModelIndex &)), this, SLOT(onTableClicked(const QModelIndex &)));
TableView* id = new TableView;//重写类可以区分单击右击
connect(id, SIGNAL(rightClicked(const QModelIndex &)), this, SLOT(onTableClicked(const QModelIndex &)));

附:点击事件槽函数

void TableEditor::onTableClicked(const QModelIndex &index)
{if (index.isValid()) {QString cellText = index.data().toString();qDebug() << "data1:" << index;qDebug() << "data1:" << index.data().toString();qDebug() << "column:" << index.column();//列qDebug() << "column:" << index.row();//行
}
}

2 .界面实现的qtableview:提升窗口部件,将UI界面上的qtableview提升为tableview

2.区分单击和双击

TableView.h文件

class TableView : public QTableView
{Q_OBJECT
public:explicit TableView(QWidget *parent = 0);
protected:void mousePressEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);signals:void leftClicked(const QModelIndex &index);void leftdoubleClicked();};

TableView.cpp文件

TableView::TableView(QWidget *parent):QTableView(parent)
{
}
void TableView::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){setCurrentIndex(QModelIndex());QTableView::mousePressEvent(event);QModelIndex index=currentIndex();if(index.row()<0&&index.column()<0)return;emit leftClicked(index);//  qDebug()<<"左击一下";}
}
void TableView::mouseDoubleClickEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){// qDebug()<<"左击两下";emit leftdoubleClicked();}}

使用方法见:1、区分单击和右击

3.其他修改

实现了双击左键选中但是不可修改,右击可以进行编辑。
双击和单机都可以获取单元格的QModelIndex。

.H文件

#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H
#include<QTableView>
#include "QMouseEvent"
class mytableview : public QTableView
{Q_OBJECT
public:mytableview(QWidget *parent= nullptr);
protected:void mousePressEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);
signals:void leftdoubleClicked(int row);
signals:
};

.CPP

#endif // MYTABLEVIEW_H#include "mytableview.h"mytableview::mytableview(QWidget *parent) :QTableView(parent)
{
}void mytableview::mousePressEvent(QMouseEvent *event)
{if( event->button()== Qt::RightButton){setCurrentIndex(QModelIndex());QTableView::mousePressEvent(event);//这里需要重新获取一次pressevent,否则获取不到currentIndex()QModelIndex index=currentIndex();this->edit(index);}if( event->button()== Qt::LeftButton){setCurrentIndex(QModelIndex());QTableView::mousePressEvent(event);//这里需要重新获取一次pressevent,否则获取不到currentIndex()QModelIndex index=currentIndex();}
}
void mytableview::mouseDoubleClickEvent(QMouseEvent *event)
{setCurrentIndex(QModelIndex());QTableView::mousePressEvent(event);//这里需要重新获取一次pressevent,否则获取不到currentIndex()QModelIndex index=currentIndex();emit leftdoubleClicked(index.row());
}

使用方法见:1、区分单击和右击

二.eventFilter截获事件(待验证)

在大多数的情况下,eventFilter是可以截获widget发来的事件的。但是qTableview的鼠标事件是从viewport()发出的,用一般的手段无法截获。下面的代码展示了正确截获viewport()事件的方式:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);ui->tableView->viewport()->installEventFilter(this);
}MainWindow::~MainWindow()
{delete ui;
}bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QEvent::MouseButtonDblClick){ui->label->setText("mouse clicked");return true;}else{return QObject::eventFilter(watched, event);}
}


http://www.ppmy.cn/news/21416.html

相关文章

二分算法学习

&#x1f33c; 扎着马尾的姑娘&#xff0c;笑容温柔很善良自在的少年 - 要不要买菜 - 单曲 - 网易云音乐 前言 本来打算做蓝桥杯2022&#xff23;&#xff0b;&#xff0b;A组省赛F题青蛙过河的,看到标签显示"二分",第一时间竟然想不到二分是什么,所以来学习下 目录…

List、Set、Map的区别

List、Set、Map的区别 ​ &#xff08;图一&#xff09; 1.面试题&#xff1a;你说说collection里面有什么子类。 &#xff08;其实面试的时候听到这个问题的时候&#xff0c;你要知道&#xff0c;面试官是想考察List&#xff0c;Set&#xff09; 正如图一&#xff0c;lis…

leetcode刷题记录总结-7.递归回溯算法(进行中)

文章目录零、回溯算法理论总览什么是回溯法回溯法的效率回溯法解决的问题如何理解回溯法回溯法模板一、组合问题[77. 组合](https://leetcode.cn/problems/combinations/)题解递归实现组合型枚举&#xff1a;每个点选与不选子集问题模板组合问题解决思路回溯思路&#xff1a;遍…

这都能第六?

文章目录&#x1f31f; 专栏介绍&#x1f31f; Vue默认版本&#x1f31f; 拥抱Vue3的UI&#x1f31f; Vue3显著优势&#x1f31f; 专栏介绍 凉哥作为 Vue 的忠诚粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#xff0c;Vue 框架目前的地位大…

leetcode12:整数转罗马数字

题目表述&#xff1a; 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 50…

你说反射有点难追,我觉得应该知难而退。

文章目录问题源码解析溯源问题解决方案第一种&#xff1a;第二种&#xff1a;第三种&#xff1a;问题 今天小伙伴遇到一个问题&#xff0c;有关于反射的&#xff0c;写个demo&#xff0c;大家看一下。 如上&#xff0c;运行之后会报错&#xff1a;出现了非法参数。 Exception…

【SpringBoot】官方表达式语言SPEL(Spring Expression Language)全方位学习

文章目录SpEL是什么运算符算数运算符&#xff08;Arithmetic&#xff09;关系运算符&#xff08;Relational&#xff09;逻辑运算符&#xff08;Logical&#xff09;条件运算符&#xff08;Conditional&#xff09;正则运算符&#xff08;Regex&#xff09;访问List或Map对象使…

字节跳动青训营--前端day5

文章目录前言一、初识HTTP拓展—输入地址到页面渲染发生了哪些事情二、协议分析1.发展2.报文2.1 请求报文&#xff1a;请求行&#xff1a;请求头主体2.2 响应报文&#xff1a;状态行响应头响应正文2.3缓存3.发展3.1 Http23.2 Https前言 仅以此文章记录学习历程 一、初识HTTP …