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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

一.重写响应事件

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_OBJECT

public:
	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);
    }
}

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6