找了几天 看官方文档终于找到了
我的需求是点击单元格 再单元格下面弹出键盘
头文件
#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H
#include <QTableWidget>
#include <QMouseEvent>
#include <QModelIndex>
#include <QDataWidgetMapper>
#include <QDebug>
#include <QHeaderView>
#include <QTimer>
#include <QTableWidgetItem>
#include <QToolTip>
#include "mykeyboard.h"
class MyTableView:public QTableView
{
Q_OBJECT
public:
MyTableView(QWidget *parent = nullptr);
~MyTableView();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
public slots:
void SlotTimerOut();
signals:
void leftClicked(const QModelIndex&);
void leftdobleClicked(const QModelIndex&);
void rightClicked(const QModelIndex&);
void rightdobleClicked(const QModelIndex&);
private:
QTimer *timeCl;
int flagl;
int flagr;
int flagd;
QModelIndex index;
};
#endif // MYTABLEVIEW_H
具体实现
#include "mytableview.h"
MyTableView::MyTableView(QWidget *parent) :QTableView(parent)
{
flagr = 0;
flagd = 0;
flagl = 0;
// 设置选中行
this->setStyleSheet("QTableView{selection-background-color:blue};");
this->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
this->setMouseTracking(true);//设置鼠标追踪
//所有列都扩展自适应宽度
this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
timeCl = new QTimer();
connect(timeCl,SIGNAL(timeout()),this,SLOT(SlotTimerOut()));
}
MyTableView::~MyTableView(){
}
#if 1
void MyTableView::mousePressEvent(QMouseEvent *event){
if (event->button() == Qt::LeftButton)
{
++flagl;
}
else if (event->button() == Qt::RightButton)
{
++flagr;
}
++flagd;
timeCl->start(200);
QTableView::mousePressEvent(event);//必须要这句不然下面一局直接-1,-1
index =currentIndex();
}
void MyTableView::mouseDoubleClickEvent(QMouseEvent *event){
++flagd;
}
void MyTableView::SlotTimerOut(){
timeCl->stop();
// qDebug() << "flag" << flagd;
if(1==flagd){//单击信号
// qDebug() << "1111";
if (1 == flagl)
{
emit leftClicked(index);
qDebug()<<this->rowViewportPosition(index.column());
qDebug()<<this->columnViewportPosition(index.row());
qDebug()<<"event->button() == Qt::LeftButton"<<index.column()<<index.row();
qDebug()<<__FUNCTION__ <<this->viewport()->mapToGlobal(QPoint(0,0)).x();
qDebug()<<__FUNCTION__ <<this->viewport()->mapToGlobal(QPoint(0,0)).y();
qDebug()<</*this->viewport()->mapToGlobal(QPoint(0,0)).x()+*/this->rowViewportPosition(index.row());
qDebug()<</*this->viewport()->mapToGlobal(QPoint(0,0)).y()+*/this->columnViewportPosition(index.column())/*+this->horizontalHeader()->height()*/;
MyKeyboardTwo *keyboard = new MyKeyboardTwo();
keyboard->move(this->viewport()->mapToGlobal(QPoint(0,0)).x()+this->columnViewportPosition(index.column()),\
this->viewport()->mapToGlobal(QPoint(0,0)).y()+this->rowViewportPosition(index.row()+1));
keyboard->show();
}else if(1 == flagr){
emit rightClicked(index);
qDebug()<<"event->button() == Qt::RightButton"<<index.column()<<index.row();
}
}else if(2==flagd){//双击信号
if(1 == flagl){
emit leftdobleClicked(index);
// qDebug()<<"event->button() == Qt::LeftDoubleButton"<<index.column()<<index.row();
}else if(1==flagr){
emit rightdobleClicked(index);
// qDebug()<<"event->button() == Qt::RightDoubleButton"<<index.column()<<index.row();
}
}
flagr = 0;
flagl = 0;
flagd = 0;
}
#endif
大哥们给个赞呗,不容易呀