PyQT崩溃(底层的C / C ++对象已被删除)“清除后”清除QTreeWidget

时间:2012-02-10 15:17:45

标签: python qt list crash qtreewidget

我尝试构建一个QTreeWidget的实时搜索,这意味着我有一个QLineEdit,当我输入时,我将过滤QTreeWidget中显示的结果。

目前我使用QTreeWidget.findItems()

获得“仍然显示的主题”
foundItems  = mainForm.ui.treeShips.findItems(text,QtCore.Qt.MatchContains)

稍后我用

清除QTreeWidget(mainForm.ui.treeShips)
mainForm.ui.treeShips.clear()

然后我想用

添加“仍然显示的项目”
mainForm.ui.treeShips.addTopLevelItems(foundItems)

然后程序崩溃,“基础C / C ++对象已被删除”错误

我的第一个想法是,通过清除treeShips,foundItems的内容也被清除,导致foundItems(print(foundItems))的对象和treeShips的对象具有相同的地址,并且当程序想要使用它时列表,它崩溃。

有人知道如何解决它, 或者有更好的想法来应用这样的“搜索过滤器”?

(我希望我能正确描述我的问题:))

感谢和最好的问候

2 个答案:

答案 0 :(得分:1)

我根据Neox的第二个想法找到了解决方法。

我迭代树中的所有项目并将隐藏标志设置为true(setHidden(True)) 然后我迭代foundItems并将隐藏标志设置为false(我认为这有效,导致两个列表具有相同的地址)

for item in mainForm.ui.treeShips.findItems("",QtCore.Qt.MatchContains):
    item.setHidden(True)

for item in foundItems:
    item.setHidden(False)

但是我不知道这不是一种肮脏的方式,但它有效:)

我希望这会帮助其他有同样问题的人。

答案 1 :(得分:0)

每当您在clear上调用QTreeWidgetItem函数时,项目都会被删除,因此您获得的错误就不足为奇了。您可以在以下QTreeWidget实现的摘录中看到它:

void QTreeWidget::clear()
{
    Q_D(QTreeWidget);
    selectionModel()->clear();
    //the treeModel here is QTreeModel, refer to snippet below
    d->treeModel()->clear();
}


void QTreeModel::clear()
{
    SkipSorting skipSorting(this);
    for (int i = 0; i < rootItem->childCount(); ++i) {
        QTreeWidgetItem *item = rootItem->children.at(i);
        item->par = 0;
        item->view = 0;
        delete item;
    }
....
}

关于搜索实施的实际问题。第一个here是实现实际搜索功能(不是实时)的一个很好的片段。 (对不起它的c ++,但我希望它很好)。

要执行实时搜索,您必须将void textChanged(const QString & text)信号从QLineEdit连接到执行搜索的插槽。

我希望能回答你的问题