【问题标题】:PyQT crash ( underlying C/C++ object has been deleted ) "after" clear QTreeWidgetPyQT 崩溃(底层 C/C++ 对象已被删除)“后”清除 QTreeWidget
【发布时间】:2012-02-10 15:17:44
【问题描述】:

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

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

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

感谢和问候

【问题讨论】:

    标签: python qt list crash qtreewidget


    【解决方案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)
    

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

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

    【讨论】:

      【解决方案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 是一个很好的sn-p,用于实现实际的搜索功能(不是实时的)。 (对不起它的 C++ 但我希望它很好)。

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

      希望能回答你的问题

      【讨论】:

      • 嘿,感谢您的快速回答,但遗憾的是,这不是我搜索的内容:) 我已将信号与处理实时搜索的自己的函数连接起来。问题不是找到项目,问题是用“仍然显示的项目”填充树
      • 我会这样。获得显示项目列表后,您可以从QTreeWidget 中删除“隐藏”项目。在我看来这里没有其他方法,因为QTreeWidget 拥有QTreeWidgetItems
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2021-06-02
      • 2015-06-08
      • 2013-07-28
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多