引言
项目中用到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);
}