QScroller 动态滚动不流畅

Posted

技术标签:

【中文标题】QScroller 动态滚动不流畅【英文标题】:QScroller Kinetic scrolling is not smooth 【发布时间】:2013-10-10 14:24:40 【问题描述】:

动态滚动对于使用 Qt 开发移动应用程序非常重要,我注意到它在设备上并不流畅(在 android 设备和 iphone 上尝试过)。它看起来有点波涛汹涌,从一个位置跳到下一个位置,并延迟跟随手指移动。这在尝试缓慢滚动时尤其明显。设备中的其他应用程序滚动更加流畅,尤其是在 iphone 中。

我用 QFrame ( ui->frame ) 做了一个简单的测试项目,其中只包含按钮。按钮被添加到 QVBoxLayout。这个框架被添加到对触摸事件做出反应的 QcrollArea 对象中。并且这个scrollArea被添加到QGridLayout中。所以滚动只在垂直方向。

我在基于 QFrame 的类的构造函数中有这段代码:

ui->frame->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
ui->frame->setMinimumHeight( 1000 );
ui->frame->setMaximumHeight( 1000 );

m_scrollArea    = new QScrollArea();

m_scrollArea->setWidget( ui->frame );
m_scrollArea->setWidgetResizable( true );
m_scrollArea->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
m_scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );

m_layout = new QGridLayout();
m_layout->addWidget( m_scrollArea );
m_layout->setContentsMargins( 0, 0, 0, 0 );
setLayout( m_layout );

QScroller::grabGesture( m_scrollArea, QScroller::LeftMouseButtonGesture );

我在我的代码中做错了什么,我能做些什么来解决这个问题。其他人是否有同样的经历?我希望我的应用程序看起来尽可能原生,这种断断续续的滚动确实不正常。

如果您需要更多信息,我会尽力提供。如果需要,我可能会尝试将我的测试项目上传到某个地方并添加一些设备的屏幕截图。

我使用的Qt版本是安卓5.1.1,ios自建Qt 5.1.0RC1。

我加了

QScrollerProperties sp;
sp.setScrollMetric( QScrollerProperties::DragStartDistance,   0.001 );
sp.setScrollMetric( QScrollerProperties::ScrollingCurve, QEasingCurve::Linear );
QScroller* qs   = QScroller::scroller( m_scrollArea );
qs->setScrollerProperties( sp );

DragStartDistance 使滚动更具响应性。我可以微调哪些其他属性以使滚动看起来更好? 我还注意到,每次从 QScrollArea 接收到 QEvent::Scroll 时都不会调用 GUI paintEvent(),我猜这可能会导致滚动不稳定。所以我每次收到 QEvent::Scroll 时都添加了代码来重新绘制 GUI,滚动看起来更流畅,但在 android 设备中仍然不完美。

我还能尝试什么?

如果您能给我提供任何帮助,我将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

您的问题的解决方案在这里:qtcentre.org。看看我那里的帖子。我的 QScroller 现在工作正常!

这是链接断开时的 Qt 代码:

尝试将视图的 verticalScrollMode 设置为 ScrollPerPixel>

setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);

【讨论】:

BartekR,我已经用解决方案更新了帖子——至少我认为是这样。那里有很好的建议,欢迎来到社区为 user3794624。是时候将其更改为正确的用户名了:-)。 这实际上帮助我解决了一个不同的问题:tableWidget 滚动得太快了,也就是说......直到我改变了滚动模式。 QScrollerProperties 的任何设置都没有真正的帮助

以上是关于QScroller 动态滚动不流畅的主要内容,如果未能解决你的问题,请参考以下文章

egret:ViewStack 中的scroller滚动条的隐藏

vue-scroller返回页面记住滚动位置

X轴动态数据显示平滑滚动

div滚动,页面不滚动

Android自定义View Scroller与平滑滚动

Android自定义View Scroller与平滑滚动