正如我们在this similar question中看到的那样,可以使用view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel)
平滑QTableWidget的滚动,当我拖动滚动条并移动它时,这非常有效。
我试图在这里实现的是当我转动鼠标滚轮时,QTableWidget会平滑地滚动几行。我没有找到导致滚动速度非常慢的setSingleStep()功能,但实际上我可以通过几行来顺畅滚动我的QTableWidget,就像我在网络浏览器中滚动网页一样。
我想我可以通过making a custom WheelEvent做到这一点,但对于我在这里尝试实现的目标来说,似乎有很多工作要做。所以我想确定我没有尝试重新发明(鼠标)滚轮。
是否有一个简单的解决方案(就像我上面提到的问题的答案)我错过了实现我想要做的事情?
如果没有,自定义WheelEvent会是正确的方法吗?
如果没有,那会是什么样的正确方法?
如果重要的话,我使用Qt Creator 4.6和Qt 5.11
答案 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();
}