自定义QTableView鼠标滚轮行为

引言

项目中用到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实现滚屏功能

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值