QTableview 获取点击单元格坐标并且带有鼠标左右键单击双击

找了几天 看官方文档终于找到了
我的需求是点击单元格 再单元格下面弹出键盘
头文件

#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

大哥们给个赞呗,不容易呀

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QTableViewQt框架提供的一个表格视图组件,可以用于显示表格数据。在QTableView中合并单元格的方式有两种: 1. 使用setSpan()函数:通过调用QTableView的model()函数获取表格数据模型,然后调用模型的setSpan()函数设置需要合并的单元格范围。示例代码如下: ``` QStandardItemModel *model = new QStandardItemModel(); QTableView *tableView = new QTableView(); tableView->setModel(model); // 合并第1行第1列和第2列 model->setSpan(0, 0, 1, 2); ``` 2. 自定义代理:继承QStyledItemDelegate类并重写sizeHint()和paint()函数,实现自定义代理。在paint()函数中使用QPainter绘制需要合并的单元格,使用sizeHint()函数返回合并后单元格的大小。示例代码如下: ``` class MergeCellsDelegate : public QStyledItemDelegate { public: QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override { // 返回合并后单元格的大小 return QSize(100, 50); } void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { // 绘制需要合并的单元格 painter->drawText(option.rect, Qt::AlignCenter, "Merged Cells"); } }; QStandardItemModel *model = new QStandardItemModel(); QTableView *tableView = new QTableView(); tableView->setModel(model); // 设置自定义代理 MergeCellsDelegate *delegate = new MergeCellsDelegate(); tableView->setItemDelegateForColumn(0, delegate); tableView->setItemDelegateForRow(0, delegate); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老了希望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值