[PyQt] QTreeView (and QTreeWidget) horizontal scroll bar jumping
Doug Bell
dougb at bellz.org
Mon Apr 7 03:21:46 BST 2014
Thomi Richards wrote:
> Hi,
>
> I have an application with a tree view that has a rather large tree inside
> it. I've tweaked the tree view header so the tree view's horizontal
> scrollbar works as I'd like, as documented here:
>
> http://qt-project.org/faq/answer/how_can_i_ensure_that_a_horizontal_scrollbar_and_not_an_ellipse_shows_up_wh
>
> However, I notice that when I use the arrow keys to navigate a tree view,
> every time I press the "Down" arrow on the keyboard to select a new tree
> view item, the horizontal scrollbar resets itself to show the
> left-hand-most content in the view.
>
> I have a minimal example that shows the problem:
>
> http://paste.ubuntu.com/7214797/
>
> Run it, expand the tree with the arrow keys till it's off the right-hand
> edge of the window. Move the scrollbar to the right, and try moving around
> with the keyboard.
>
> Ideally, the horizontal scrollbar would move left/right to keep the
> currently selected item's text in view.
>
> Does anyone know if this can be achieved? I imagine I'd need to override or
> set something in QAbstractItemView, but the documentation for that class
> seems rather opaque to me.
I fixed this problem in my TreeLine program by overriding the
QTreeView::scrollTo method as shown below:
def scrollTo(self, index, hint=QtGui.QAbstractItemView.EnsureVisible):
"""Scroll the view to make the node at index visible.
Overriden to stop autoScroll from horizontally jumping when selecting
nodes.
Arguments:
index -- the node to be made visible
hint -- where the visible item should be
"""
horizPos = self.horizontalScrollBar().value()
super().scrollTo(index, hint)
self.horizontalScrollBar().setValue(horizPos)
-Doug
More information about the PyQt
mailing list