使用鼠标滚轮平滑滚动QTableWidget

时间:2018-06-11 09:16:47

标签: c++ qt

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

我试图在这里实现的是当我转动鼠标滚轮时,QTableWidget会平滑地滚动几行。我没有找到导致滚动速度非常慢的setSingleStep()功能,但实际上我可以通过几行来顺畅滚动我的QTableWidget,就像我在网络浏览器中滚动网页一样。

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

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

如果没有,自定义WheelEvent会是正确的方法吗?

如果没有,那会是什么样的正确方法?

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

1 个答案:

答案 0 :(得分: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();
}