Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用鼠标滚轮平滑滚动QTableWidget_C++_Qt - Fatal编程技术网

C++ 使用鼠标滚轮平滑滚动QTableWidget

C++ 使用鼠标滚轮平滑滚动QTableWidget,c++,qt,C++,Qt,正如我们在中所看到的,可以通过使用view->setVerticalScrollModeQAbstractItemView::ScrollPerPixel平滑QTableWidget的滚动,当我拖动滚动条并四处移动它时,这非常有效 我在这里试图实现的是,当我转动鼠标滚轮时,QTableWidget将平滑地滚动几行。我不是在寻找导致滚动速度非常慢的功能,而是像在web浏览器中滚动网页一样,将QTableWidget平滑地滚动几行 我想我也许可以做到这一点,但这似乎是我在这里试图实现很多工作。所以我

正如我们在中所看到的,可以通过使用view->setVerticalScrollModeQAbstractItemView::ScrollPerPixel平滑QTableWidget的滚动,当我拖动滚动条并四处移动它时,这非常有效

我在这里试图实现的是,当我转动鼠标滚轮时,QTableWidget将平滑地滚动几行。我不是在寻找导致滚动速度非常慢的功能,而是像在web浏览器中滚动网页一样,将QTableWidget平滑地滚动几行

我想我也许可以做到这一点,但这似乎是我在这里试图实现很多工作。所以我想确定我没有试图重新发明鼠标滚轮

有没有一个简单的解决方案,就像我在上面链接的问题的答案一样,让我无法实现我的目标

如果不是,那么定制WheelEvent是正确的方式吗

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


我将QtCreator 4.6与Qt5.11结合使用,如果这很重要的话

它真的没有您认为的QTableView子类那么糟糕。这是我的解决方案,其中包括一些调试语句来显示正在发生的事情。对于ScrollPerPixel模式,您可能希望在项目中包含一个乘法因子,以使其滚动更快

#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();
}

对不起,已经很久了,直到现在我才有机会再做这个项目。