我有一个从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调试器上的堆栈跟踪显示了需要QModelIndex的mouseSelectEvent和其他函数。
很抱歉问了这么长的问题。有人能帮我解决这个问题吗?
谢谢。
发布于 2014-09-10 18:35:05
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();,但我不确定这一点。
https://stackoverflow.com/questions/18364632
复制相似问题