我尝试构建一个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的对象具有相同的地址,并且当程序想要使用它时列表,它崩溃。
有人知道如何解决它, 或者有更好的想法来应用这样的“搜索过滤器”?
(我希望我能正确描述我的问题:))
感谢和最好的问候
答案 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
连接到执行搜索的插槽。
我希望能回答你的问题