自定义QTableView鼠标滚轮行为

来源:互联网 发布:杜兰特体测数据 编辑:程序博客网 时间:2024/05/18 06:22

  • 引言
  • 方法1
    • 在头文件中声明滚轮事件函数
    • 重新实现wheelEvent函数
  • 方法2
    • 声明事件过滤器
    • 安装事件过滤器
    • 重写事件过滤器
  • 参考

引言

项目中用到QTableView,其中部分item行高较高,而QTableView默认的鼠标滚轮行为只能定义为一次滚动一个像素或一次滚动一个item,如下:

ui_NetWork.tableView_Exchange->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);ui_NetWork.tableView_Exchange->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);

前者太慢,后者又不连续。
本文采用重载wheelEvent()事件的方法实现更加顺滑、舒适的滚轮行为。

方法1

1.在头文件中声明滚轮事件函数

protected:      void wheelEvent(QWheelEvent*event);//滚轮事件

2.重新实现wheelEvent()函数

void NetworkFrame::wheelEvent(QWheelEvent *event){    int para=event->angleDelta().y();//获得鼠标滚轮的滚动距离para,para<0向下滚动,>0向上滚动      int tempStep=ui_NetWork.tableView_Exchange->verticalScrollBar()->value();    if (para<0)      {             //向下滚动,设定鼠标滚轮每滚动一个单位,滑块就移动20个单位          ui_NetWork.tableView_Exchange->verticalScrollBar()->setSliderPosition(tempStep+20);      }      else      {          //向上滚动          ui_NetWork.tableView_Exchange->verticalScrollBar()->setSliderPosition(tempStep-20);      }     event->accept();      //接收该事件}

方法2

如果这个控件没有独立的实现函数,比如是在UI中添加的,也没有别的需要实现的函数,可使用该方法。
实际上当鼠标位于控件上并滚动时,接收滚动动作的是该控件的滚动条,所以只要在主窗口的eventFilter中对target为滚动条的滚轮动作进行截获并处理就好了,当然首先要给滚动条安装事件过滤器。

1.声明事件过滤器

protected:      bool eventFilter(QObject *obj, QEvent *event);//事件过滤器

2.安装事件过滤器

    //安装事件过滤器,在主窗口的eventFilter中对target为滚动条的滚轮动作进行截获并处理    ui_NetWork.tableView_Exchange->verticalScrollBar()->installEventFilter(this);

3.重写事件过滤器

bool NetworkFrame::eventFilter(QObject *obj, QEvent *event){    if (obj == ui_NetWork.tableView_Exchange->verticalScrollBar())    {          if(event->type() == QEvent::Wheel)          {              QWheelEvent *event1 = static_cast<QWheelEvent *>(event);              int para=event1->angleDelta().y();//获得鼠标滚轮的滚动距离para,para<0向下滚动,>0向上滚动             int tempStep=ui_NetWork.tableView_Exchange->verticalScrollBar()->value();            if (para<0)              {                     //向下滚动,设定鼠标滚轮每滚动一个单位,滑块就移动20个单位                  ui_NetWork.tableView_Exchange->verticalScrollBar()->setSliderPosition(tempStep+20);              }              else              {                  //向上滚动                  ui_NetWork.tableView_Exchange->verticalScrollBar()->setSliderPosition(tempStep-20);              }             return true;          }      }      //其它事件交基类处理      return QMainWindow::eventFilter(obj, event); }

参考

自定义QTreeWidget和QTableWidget控件鼠标滚轮事件
滚动条QScroolBar实现滚屏功能