滚动QListView以在列表开头插入时将项目保持在视图中

时间:2014-05-28 14:40:04

标签: c++ qt

我有一个QListView,其中包含我要插入数据的模型。我在列表的开头插入数据,导致视图中的所有项目向下滚动。

自动滚动视图以保持视图固定的最佳方法是什么(即当模型中插入新项目时,视图应随着可见项移动?)

3 个答案:

答案 0 :(得分:2)

这似乎有效。问题实际上并没有滚动到特定的索引 - 它首先找到了正确的索引。

以下代码滚动视图,以便在列表开头插入时在视图中保留相同的项目。它还会检查视图是否位于列表顶部,并且在这种情况下不会滚动。

QScrollBar *pVerticalScrollBar = m_pUi->listView->verticalScrollBar();
bool bScrolledToTop = pVerticalScrollBar->value() == pVerticalScrollBar->minimum();
int iRowIndex = m_pUi->listView->indexAt(QPoint(8, 8)).row();
int iRowCount = m_pInfoListModel->rowCount();

/*
    insert text into m_pInfoListModel here
*/

// move scroll bar to keep current items in view (if not scrolled to the top)
if (bScrolledToTop == false)
{
    iRowCount = m_pInfoListModel->rowCount() - iRowCount;
    m_pUi->listView->scrollTo(m_pInfoListModel->index(iRowIndex + iRowCount, 0), QAbstractItemView::PositionAtTop);
}

如果我在列表的顶部,这会给我一个滚动的项目列表,但是当我不想查看下方的项目时,视图保持固定。

答案 1 :(得分:0)

我会做以下事情:

找到我想要保持可见的列表视图项,而不是使用

获取其坐标
QRect QAbstractItemView::visualRect(const QModelIndex &index)

与项目的坐标相比,我会调用QScrollArea::ensureVisible(int, int, int, int)函数,以便在将每个新项目添加到列表后保持项目可见。

答案 2 :(得分:0)

我想您可以将setAutoScroll(True)赋予QListView实例。