Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I have a QListView in Icon mode with lots of icons, so that a scrollbar appears, but the scrolling is not smooth and this IMHO confuses the user since it jumps abruptly from one point to another at each scroll. I would like to make the scrolling smooth but I didn't find anything in the docs. Is it possible?

This seems like the correct property but I couldn't get it to work as well. Does anyone have any solutions? It seems to playing around with effect verticalScrollBar()->singlestep() Constantin Jul 26, 2013 at 23:20 _my_listview->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); worked perfectly fine. Scrolling by dragging the bar itself is now smooth. Using Scrollwheel it still jumps a few items. KYL3R Feb 6, 2019 at 12:01

If I understand your question correctly you would like to redefine the scrolling behavior of the widget. I guess what happens is that listview is getting scrolled by the item's height whenever users hits a scroll arrow (marked as b on the image below).

For a vertical scroll bar connected to a list view, scroll arrows typically move the current position one "line" up or down, and adjust the position of the slider by a small amount. I believe line in this case it is an icon's height. You can adjust items height by installing and item delegate (setItemDelegate) and overriding its sizeHint method. Though this would not help you to solve this problem. What you could try is to create a QListView descendant and override its updateGeometries method. There you can setup the vertical scrollbar step to the value you want, I guess 1 or 2 for this task. Below is an example of the custom listview:

class TestListView : public QListView
Q_OBJECT
public:
    explicit TestListView(QWidget *parent = 0);
protected:
    virtual void updateGeometries();
TestListView::TestListView(QWidget *parent) :
    QListView(parent)
    //???
void TestListView::updateGeometries()
    QListView::updateGeometries();
    verticalScrollBar()->setSingleStep(2);

hope this helps, regards

Setting singleStep and pageStep in updateGeometries seems to work properly for mouse scroll. – Adrian Maire Jan 1 at 14:03

I have a QlistWidget* in ui->barra_scroll and I feel very smooth with this.

QScrollBar *qsb = ui->barra_scroll->verticalScrollBar();
qsb->setSingleStep(5);
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.