Прокрутка QTableWidget плавно с помощью колесика мыши - PullRequest
0 голосов
/ 11 июня 2018

Как мы видим в этот похожий вопрос , можно сгладить прокрутку QTableWidget с помощью view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel), и это прекрасно работает, когда я перетаскиваю полосу прокрутки и перемещаю ее.

Здесь я пытаюсь добиться того, чтобы, поворачивая колесо мыши, QTableWidget плавно прокручивал несколько строк.Я не ищу функцию setSingleStep () , которая привела бы к очень очень медленной прокрутке, но на самом деле плавно прокручивал мой QTableWidget на несколько строк, как я прокручиваю веб-страницу в своем веб-браузере.

Я думаю, что смогу сделать это, сделав собственное WheelEvent , но мне кажется, что здесь много работы для достижения этой цели.Поэтому я хотел бы быть уверен, что я не пытаюсь заново изобрести колесо (мыши).

Есть ли простое решение (например, ответ на вопрос, который я связал выше), которое я упустил, чтобы добиться того, что яя пытаюсь это сделать?

Если нет, то будет ли настраиваемый WheelEvent правильным способом сделать это?

Если нет, то каким будет этот правильный путь?

Iиспользую Qt Creator 4.6 с Qt 5.11, если это имеет значение

1 Ответ

0 голосов
/ 07 ноября 2018

Это на самом деле не так плохо, как вы думаете, подкласс 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...