使用鼠标滚轮平滑滚动 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的主要内容,如果未能解决你的问题,请参考以下文章