QTreeView行删除,导致崩溃

时间:2018-04-21 23:52:24

标签: c++ qt qtreeview

我偶然发现了以下问题: 我正在使用QTreeView和自定义TreeItem实现。大部分代码都是从this example

复制的

问题是:

当我尝试从列表程序崩溃中删除行时。在大多数情况下,它在访问QModelIndex中的parent()时抛出错误。它似乎正在尝试访问不存在的对象。在Call stack屏幕下方。

调用堆栈

enter image description here

我找到了一个解决方法:当我在删除行之前强制执行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;
    }

}

0 个答案:

没有答案