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

Scrolling QListView to keep items in view while inserting at start of list

本文关键字:项目 视图 插入 QListView 列表 开始 滚动      更新时间:2023-10-16

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

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

这似乎行得通。问题不在于滚动到特定的索引,而在于首先找到正确的索引。

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

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);
}

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

我猜你可以把setAutoScroll(True)QListView实例

我会这样做:

找到我想要保持可见的列表视图项,然后使用

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

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