使用鼠标滚轮平滑滚动 QTableWidget

Posted

技术标签:

【中文标题】使用鼠标滚轮平滑滚动 QTableWidget【英文标题】:Scrolling QTableWidget smoothly with the mousewheel 【发布时间】:2018-06-11 09:16:47 【问题描述】:

正如我们在this similar question 中看到的,使用view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel) 可以平滑QTableWidget 的滚动,当我拖动滚动条并四处移动时,这非常有效。

我在这里想要实现的是,当我转动鼠标滚轮时,QTableWidget 会平滑滚动几行。我不是在寻找setSingleStep() 函数,它会导致滚动非常缓慢,而是真的像在我的网络浏览器中滚动网页一样平滑地滚动我的 QTableWidget 几行。

我想我可以通过making a custom WheelEvent 做到这一点,但对于我在这里想要实现的目标来说似乎需要做很多工作。所以我想确定我不是要重新发明(鼠标)***。

是否有一个简单的解决方案(如我上面链接的问题的答案)我错过了实现我想要做的事情?

如果不是,自定义 WheelEvent 是否是正确的方法?

如果不是,那正确的方法是什么?

如果重要的话,我正在使用 Qt Creator 4.6 和 Qt 5.11

【问题讨论】:

【参考方案1】:

继承 QTableView 并没有你想象的那么糟糕。这是我的解决方案,其中包括一些调试语句来显示正在发生的事情。对于ScrollPerPixel 模式,您可能希望在item 中包含一个乘数,以使其滚动得更快。

#include <QtWidgets>

class MyTableClass : public QTableView //subclass standard QTableView

    Q_OBJECT

protected:
    void wheelEvent(QWheelEvent* e)
    
        QString result;
        int items = e->delta() > 0 ? (e->delta() + (e->DefaultDeltasPerStep - 1)) / e->DefaultDeltasPerStep :
                                     (e->delta() - (e->DefaultDeltasPerStep - 1)) / e->DefaultDeltasPerStep; //round away from zero

        qDebug() << QString("delta %1").arg(e->delta());
        qDebug() << QString("items %1").arg(items);
        if (e->orientation() == Qt::Vertical)
        
            this->verticalScrollBar()->setValue(this->verticalScrollBar()->value()-items);
            if (items > 0)
            
                result = "Mouse Wheel Event: UP";
            
            else
            
                result = "Mouse Wheel Event: DOWN";
            
        
        else
        
            this->horizontalScrollBar()->setValue(this->horizontalScrollBar()->value()-items);
            if (items > 0)
            
                result = "Mouse Wheel Event: LEFT";
            
            else
            
                result = "Mouse Wheel Event: RIGHT";
            
        
        qDebug() << result;
    
;

#include "main.moc" //assuming the file containing this code is named main.cpp
int main(int argc, char* argv[])

    QApplication app(argc, argv);
    QWidget window;
    QVBoxLayout* vbox = new QVBoxLayout();
    QTableView* tableView = new MyTableClass();

    vbox->addWidget(tableView);

    window.setLayout(vbox);
    window.show();

    return app.exec();

【讨论】:

抱歉,久违了,直到现在我才有机会再次参与这个项目。

以上是关于使用鼠标滚轮平滑滚动 QTableWidget的主要内容,如果未能解决你的问题,请参考以下文章

jquery垂直鼠标滚轮平滑滚动

使用鼠标滚轮平滑滚动缓动效果[关闭]

带有鼠标滚轮效果的jQuery平滑滚动

香草javascript中鼠标滚轮上的平滑垂直滚动?

网页不能用鼠标滚轮控制滚动条 我鼠标滚轮上下滚动。。但网页没反应。这是怎么回事。。怎么修复。。

在所有浏览器中为我的网站启用平滑滚动