【问题标题】:Scrolling QTableWidget smoothly with the mousewheel使用鼠标滚轮平滑滚动 QTableWidget
【发布时间】: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

【问题讨论】:

    标签: c++ qt


    【解决方案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();
    }
    

    【讨论】:

    • 抱歉,久违了,直到现在我才有机会再次参与这个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多