1

我有一个模型的子类,QAbstractListModel其中QList包含QDateTime用于维护此列表的数据。我必须将这些数据保留一个小时,即,旧数据将从列表中删除。这基本上是 FIFO 列表。我有一个代理模型(的子类QSortFilterProxyModel)来对数据进行排序。每当数据发生变化时,代理模型都会丢失索引并显示未过滤的数据。以下是执行此操作的代码片段。

emit layoutAboutToBeChanged();
beginInsertRows(QModelIndex(), 0, 1); //we are prepending
m_entries.prepend(e);
endInsertRows();
emit layoutChanged();

这似乎解决了这个问题。但是,如果在视图 ( QTreeView) 上选择了某些内容,那么应用程序会在一段时间后因大量此类错误消息而崩溃。

QSortFilterProxyModel: index from wrong model passed to mapFromSource 
QSortFilterProxyModel: index from wrong model passed to mapFromSource 
QSortFilterProxyModel: index from wrong model passed to mapFromSource

调试器上的堆栈跟踪显示mouseSelectEvent需要的和其他功能QModelIndex

对不起,很长的问题。有人可以帮忙解决这个问题吗?

谢谢。

4

1 回答 1

0

beginInsertRows 的文档说void QAbstractItemModel::beginInsertRows(const QModelIndex & parent, int first, int last),这意味着当您仅插入一个项目参数时,first = last = 0。在您的代码段中,您插入一个项目,m_entries.prepend(e)但您不关心要插入两个:beginInsertRows(QModelIndex(), 0, 1);视图接收到已插入两行的信号当它要求第二个时 - 繁荣!访问冲突。你需要的是beginInsertRows(QModelIndex(), 0, 0);. 另外,我认为您不需要,emit layoutAboutToBeChanged()emit layoutChanged();我不确定。

于 2014-09-10T10:35:05.103 回答