QT - QTableView removeRow() 崩溃

Posted

技术标签:

【中文标题】QT - QTableView removeRow() 崩溃【英文标题】:QT - QTableView removeRow() crashing 【发布时间】:2014-03-25 20:47:06 【问题描述】:

这个函数应该从我的 QStandardItemModel 中删除一行,附加到一个 QTable 视图。

void ModManager::delete_Addin(int index)

    QString addinId;
    int i;

    addinId = tableModel->item(index,0)->text();

    for(i=0;i<modList->size();i++)
    
        if(modList->at(i)->Id() == addinId)
        
            delete modList->takeAt(i);
            break;
        
    
    tableModel->removeRow(index);

奇怪的是程序在最后一条指令处崩溃,tableModel-&gt;removeRow(index); 而且它不会超出范围,因为tableModel-&gt;item(index,0) 是有效的。 那会是什么?

【问题讨论】:

我会在拨打tableModel-&gt;removeRow(index); 之后尝试拨打delete modList-&gt;takeAt(i); 如果它被压碎,那么 它超出范围。检查调试控制台的内容。做if (index&gt;-1 &amp;&amp; index&lt;tableModel-&gt;rowCount())tableModel-&gt;removeRow(index); 【参考方案1】:

代码不存在modListtableModel 之间的相关性。 tableModel-&gt;item(index,0)在修改modList前有效,tableModel-&gt;rowAt(index)修改后失效。有几种可能:

修改modList 会影响tableModel,正如@vahancho 所暗示的那样。这可以通过注释掉 for 循环或更改行的顺序来验证。这可以通过使用modList 作为tableModel 的真实数据来实现,例如,您是否通过将modList-&gt;at(i) 返回为QTableModel::Data 并将modList-&gt;count() 作为QTableModel::rowCount() 返回来实现自定义QTableModel?

modList 不影响tableModel,但该项目在其他地方被引用。这不能从代码中看出。

【讨论】:

ok ModList 是一个 QList,带有指向 Addin 的指针,这是我制作的一个自定义对象,它不能修改表中的任何内容。我不知道它会对桌子产生什么影响。 刚刚尝试在循环开始前输入delete modList-&gt;takeAt(i);。仍然崩溃。 我仔细检查了传递的index,它在范围内。会是什么? 猜测该项目在其他地方被引用。如果您确定项目索引在范围内并且有效,则可以通过删除其他人引用的内容来导致崩溃。为什么不在崩溃时发布回调堆栈,以便人们可以帮助您。 好的,我怎样才能找到要在此处发布的回调堆栈?

以上是关于QT - QTableView removeRow() 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Qt 4.8 endInsert/RemoveRows 导致内存泄漏?

更改模型后重新调整 QTableView

PyQt5在QTableview中拖拽导致选中行消失

在QTreeView中拖放,removeRows没有被调用

Qt 学习笔记 10.QTableWidget

Qt/QTableView/SQLite如何连接?