【发布时间】:2015-12-12 06:26:02
【问题描述】:
我有一个带有自定义模型的列表视图。该模型允许我将文本添加到列表底部(使用'addText(const QString&)')并从列表顶部删除项目(使用'removeItemsFromTop(int _iCount)')。
向视图添加文本并将模型大小保持在某个最大值以下(比如说“MAX_LIST_SIZE”),同时始终保持视图(即当前选择和视图中的项目在删除项目时不应该改变)的最佳方法是什么)。
解决方案最好是一个我可以在任何我使用我的自定义模型的地方使用的函数。
我查看了 QListView 上的 indexAt(...)、scrollTo(...)、currentIndex(...) 和 setCurrentIndex(...) 方法,但我不知道如何将所有这个在一起。
到目前为止,我有(用于自动滚动视图)
// add items here ...
// cleanup
QModelIndex indexViewTop = listView->indexAt(QPoint(8, 8));
if (listModel->rowCount() > MAX_SIZE)
{
int iRemoveCount = (listModel->rowCount() - MAX_SIZE) + MAX_SIZE/10;
listModel->clearTextFromFront(iRemoveCount);
listView->scrollTo(indexViewTop.sibling(indexViewTop.row() - iRemoveCount, 0), QAbstractItemView::PositionAtTop);
}
这应该在删除项目时滚动列表视图以保持视图一致,但 indexAt(...) 总是返回无效索引。
为了保持选择一致,我尝试了:
// add items her ...
// cleanup
if (listModel->rowCount() > MAX_SIZE)
{
int iCurrentViewIndex = listView->currentIndex().row();
int iRemoveCount = (listModel->rowCount() - MAX_SIZE) + MAX_SIZE/10;
listModel->clearTextFromFront(iRemoveCount);
listView->setCurrentIndex(listModel->index(iCurrentViewIndex - iRemoveCount, 0));
}
这似乎可行,但我仍然卡在自动滚动上。
【问题讨论】: