gpt4 book ai didi

c++ - QSortFilterProxyModel 崩溃的应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 14:03:00 26 4
gpt4 key购买 nike

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

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

这似乎解决了问题。但是,如果在 View (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 的函数。

很抱歉这个问题很长。有人可以帮忙解决这个问题吗?

谢谢。

最佳答案

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 layoutToBeChanged()emit layoutChanged(); 但我不确定。

关于c++ - QSortFilterProxyModel 崩溃的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com