PYQT崩溃(基础C/C++对象已被删除)“清除”后的QTreWIDG

2024-10-02 12:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在我得到的“仍然显示它”与QTreeWidget.findItems()

foundItems  = mainForm.ui.treeShips.findItems(text,QtCore.Qt.MatchContains)

稍后,我清除QTreeWidget(mainForm.ui.treeShips)与

^{pr2}$

然后我想添加“仍然显示的项目”与

mainForm.ui.treeShips.addTopLevelItems(foundItems)

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

我的第一个想法是,在清除树型结构时,foundItems的内容也会被清除,因为foundItems的对象(print(foundItems))和树型对象的地址相同,当程序想要处理这个列表时,它崩溃了。在

有人知道怎么修吗, 或者有更好的主意来应用这样的“搜索过滤器”?在

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

谢谢并致以诚挚的问候


Tags: 对象text程序uiqt树型pr2qtcore
2条回答

每当您对QTreeWidgetItem调用clear函数时,这些项都会被删除,因此您得到的错误并不奇怪。您可以在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++的,但我希望它没问题)。在

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

我希望这能回答你的问题

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

我迭代树中的所有项,并将hidden标志设置为true(setHidden(true)) 然后我迭代foundItems并将hidden标志设置为false(我认为这是可行的,因为两个列表都有相同的地址)

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

for item in foundItems:
    item.setHidden(False)

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

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

相关问题 更多 >

    热门问题