我偶然发现了以下问题: 我正在使用QTreeView和自定义TreeItem实现。大部分代码都是从this example
复制的问题是:
当我尝试从列表程序崩溃中删除行时。在大多数情况下,它在访问QModelIndex中的parent()时抛出错误。它似乎正在尝试访问不存在的对象。在Call stack屏幕下方。
调用堆栈
我找到了一个解决方法:当我在删除行之前强制执行treeView对其进行排序时,应用程序不会崩溃。默认情况下,列0按降序排序,因此我必须按升序对其进行排序,然后按降序排序。 我也有自定义过滤器代理。
TreeItem.cpp:
bool TreeItem::removeChildren(int position, int count)
{
if (position < 0 || position + count >= childItems.size())
return false;
for (int row = 0; row < count; ++row)
delete childItems.takeAt(position);
return true;
}
的TreeModel:
bool TreeModel::removeRows(int position, int rows, const QModelIndex &parent)
{
TreeItem *parentItem = getItem(parent);
bool success = true;
beginRemoveRows(parent, position, position + rows - 1);
success = parentItem->removeChildren(position, rows);
endRemoveRows();
return success;
}
Data.cpp:
bool Data::removeJob(Job* job)
{
if (job)
{
TreeItem* parent = job->parentItem;
int jobItemRow = parent->childItems.indexOf(job);
QModelIndex jobItemIndex = Model->getIndex(jobItemRow, 0, job);
int dayItemRow = Model->rootItem->childItems.indexOf(parent);
QModelIndex dayItemtIndex = Model->getIndex(dayItemRow, 0, parent);
int index = JobList.indexOf(job);
Model->removeRow(jobItemRow, jobItemIndex.parent());
JobList.takeAt(index);
return true;
}
return false;
}
CustomFilter.cpp:
bool CustomSortFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
if (left.data().canConvert<QDateTime>())
{
return left.data().toDateTime() < right.data().toDateTime();
}
else if (left.data().canConvert<QString>())
{
return left.data().toString() < right.data().toString();
}
else {
return false;
}
}