Сбой PyQT (основной объект C / C ++ был удален) «после» очистки QTreeWidget - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь построить поиск в реальном времени для 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 ]

1 голос
/ 12 февраля 2012

я нашел обходной путь, основанный на 2-й идее 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)

Но я не знаю, если это не грязный способ, но это работает:)

Iнадеюсь, что это поможет другим людям, у которых есть такая же проблема.

0 голосов
/ 10 февраля 2012

Каждый раз, когда вы вызываете функцию 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;
    }
....
}

Вам актуален вопрос о реализации поиска.Сначала здесь - хороший фрагмент для реализации реальных функций поиска (не в реальном времени).(извините это с ++, но я надеюсь, что это хорошо).

Для поиска в реальном времени необходимо подключить сигнал void textChanged(const QString & text) из QLineEdit к слоту, в котором выполняется поиск.

Надеюсь, что ответит на ваш вопрос

...