[Development] Improve performance (listview + onVerticalVelocityChanged)
Martin Leutelt
martin.leutelt at basyskom.com
Fri Jan 27 09:28:21 CET 2017
Hi,
From: Bernhard B <schluchti at gmail.com>
To: <development at qt-project.org>
Sent: 1/26/2017 8:09 PM
Subject: Re: [Development] Improve performance (listview + onVerticalVelocityChanged)
I think I solved my problem. In case someone is interested, that's my solution:
//hide "back to top" button when movement ended and we are//at index 0onMovementEnded: {
if(indexAt(contentX, contentY) === 0){ backToTopButton.visible = false; }}
onFlickStarted: { //when user scrolls fast enough up, show the tab bar //and the "back to top" button if(verticalVelocity < -flickTabBarTreshold) { backToTopButton.visible = true; tabBar.show(); }
//when user scrolls fast enough down hide "back to top" button //and the tab bar if(verticalVelocity > flickTabBarTreshold){ backToTopButton.visible = false; tabBar.hide(); }}
I don't know if this is the best solution, but it seems to work.
I guess you could also bind the visibility of your backToTopButton/tabBar to the ListView properties atYBeginning, flickingVertically and the comparison of
the verticalVelocity against your threshold.
Just as an info: the 'development' list is for questions regarding the development of Qt itself, questions regarding the usage of Qt should go to the 'interest' list.
More people will respond there.
Thanks,
Bernhard
Regards
Martin
2017-01-26 15:38 GMT+01:00 Bernhard B <schluchti at gmail.com>:
Hi,
I am currently trying to optimize my Listview for performance. I already removed most of the bottlenecks by following the great recommendations at: http://doc.qt.io/qt-5/qtquick-performance.html
However, there is one problem I don't how to solve. It's about this code part:
ListView{
clip: true
property real flickTabBarTreshold;
Component.onCompleted: {
flickTabBarTreshold = (2/3) * maximumFlickVelocity;
}
onVerticalVelocityChanged: {
//when user scrolls fast enough up, show the tab bar
//and the "back to top" button if(verticalVelocity < -flickTabBarTreshold) {
backToTopButton.visible = true; tabBar.show(); }
//when user scrolls fast enough down hide "back to top" button
//and the tab bar
if(verticalVelocity > flickTabBarTreshold){ backToTopButton.visible = false; tabBar.hide(); }
//always disable "back to top button" when top reached
if(indexAt(contentX, contentY) === 0)
backToTopButton.visible = false; }
}
This part is one of the biggest performance bottlenecks at the moment (as it gets called a lot of times) and has a significant impact on the scrolling behavior (lagging).
My idea was to put that code somehow in my C++ Listmodel and emit only a signal when something actually changed.
For the last part
//always disable "back to top button" when top reached
if(indexAt(contentX, contentY) === 0)
backToTopButton.visible = false;
I think it should be possible to check that in the
QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
method. When index.row() === 0, I a signal will be emitted. In QML I am connecting on that signal and execute backToTopButton.visible = false;
I haven't tested it yet, but I think it should work.
For the other two conditions however, I am a little bit clueless.
Does anyone of you guys maybe have an idea on how to improve that?
Any help is really appreciated.
Thanks,
Bernhard
_______________________________________________
Development mailing list
Development at qt-project.org
http://lists.qt-project.org/mailman/listinfo/development
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20170127/89ff9809/attachment.html>
More information about the Development
mailing list