0

我尝试为 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 的对象具有相同的地址,并且当程序想要使用此列表时,它碰撞。

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

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

谢谢和最好的问候

4

2 回答 2

1

我找到了基于 Neox 的第二个想法的解决方法。

我迭代树中的所有项目并将隐藏标志设置为真( setHidden(True) )然后我迭代foundItems并将隐藏标志设置为假(我认为这可行,因为两个列表具有相同的地址)

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

for item in foundItems:
    item.setHidden(False)

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

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

于 2012-02-12T05:01:23.227 回答
0

每当您clear在 a 上调​​用函数时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;
    }
....
}

关于搜索实施的实际问题。首先,这里有一个很好的片段,用于实现实际的搜索功能(不是实时的)。(对不起它的 C++ 但我希望它很好)。

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

我希望这能回答你的问题

于 2012-02-10T15:34:41.977 回答