重写QTableView类解决鼠标右击、单击、双击问题(附使用方法)
admin
2024-05-22 06:13:10
0

目录

一.重写响应事件

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 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
#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);}
}

相关内容

热门资讯

推荐点古风歌曲类似倾尽天下和天... 推荐点古风歌曲类似倾尽天下和天下这类的喜欢倾尽天下和天下那种大气的古风,很有那种武侠范儿,最好不推荐...
对爱人超级宠爱,是真正的暖男的... 对爱人超级宠爱,是真正的暖男的星座你知道有哪些吗?应该就是双子座白羊座和处女座的男生,因为他们能够给...
怎么写书 怎么写书写作是一个很庞大的领域,这个领域有不同的分支,所以你要先想好自己适合写什么风格类型的,并且先...
狼的典故,狼的典故有哪些?​ 狼的典故,狼的典故有哪些?​狼的典故有哪些?《狼来了》、《小红帽》、蒲松龄的《狼》
给孩子上户口是一件很麻烦的事么... 给孩子上户口是一件很麻烦的事么?怎么上?如题:给孩子上户口是一件很麻烦的事么?怎么上?只要你们有户口...
请问,欧陆风云秘籍怎么输入,请... 请问,欧陆风云秘籍怎么输入,请大家指点(那个改键盘输入为英国的方法,不得~~或者是我不会用)?请大家...
郭静新专辑有哪些歌?还有在树上... 郭静新专辑有哪些歌?还有在树上唱歌那张专辑有哪些歌…同上新专辑有《嫁妆》,《每一天都不同》,物没《聊...
原创 美... 2025年的盛夏,北京、上海、广州三城夜幕下,一场由美团、阿里、京东三巨头引发的外卖补贴大战,将奶茶...
蒸扣碗怎么蒸好吃,蒸扣碗肉的家... 蒸扣碗的美味秘诀与家常做法大全 一、核心技巧:决定成败的3个关键点 去腥增香三件套 冷水焯...
入夏后最受欢迎的8道家常快手菜... 入夏后,人们更倾向于选择清淡、快速且营养丰富的家常快手菜,以适应炎热天气带来的食欲变化。根据我搜索到...
原创 每... “从手到口,从口到心,中国人延续着对世界和人生特有的感知方式。只要点起炉火,端起碗筷,每个平凡的人,...
2025“必吃嘉年华”首落重庆... 7月11日至13日,由渝中区商务委联合美团引入2025大众点评“必吃嘉年华”落地重庆天地。 “必吃...
“食”尚方庄 品味南城 202... 人民网北京7月13日电(记者鲍聪颖)潮饮体验、美食甄选、文创潮玩……7月12日,首届“食”尚方庄 品...
极地精灵暑期限定!苏州迎来一批... 现代快报讯(记者 高达)经过长途跋涉,一群来自吉林长春的特殊“客人”——巴布亚企鹅,已于近日顺利抵达...
销售坚持到最后一秒都不放弃的小... 销售坚持到最后一秒都不放弃的小故事,特别是在最后又发生让他们崛起了!从前有一个池塘,池塘里面有好多青...
如何应对中年婚姻危机?好夫妻不... 如何应对中年婚姻危机?好夫妻不会改变对方,而是彼此适应,这事你怎么看?其实我们应该要理智的去面对中年...
以“童年是什么,童年是什么,童... 以“童年是什么,童年是什么,童年还是什么”的句式造句有哪些?童年是除开的花朵,童年是清澈的溪流,童年...
WOW大灾变,考古学奖励问题 WOW大灾变,考古学奖励问题在大灾变新推出的考古学中,每个种族的文物中各有多少个稀有奖励…虫子坐骑是...
梦到好多棺材:好多血和水:怎么... 梦到好多棺材:好多血和水:怎么回事棺--个体空间。血--代价。水--生意。
轻轻地你走了,正如你轻轻地来,... 轻轻地你走了,正如你轻轻地来,你挥一挥衣袖,不带走一片云彩,却卷走一堆钞票~钞钞是别离的笙箫,票票是...