Ошибка выполнения PyQt для QTreeWidgetItem

Я пытаюсь избежать известной ошибки выполнения PyQt при удалении базового объекта C/C++:

http://www.riverbankcomputing.com/pipermail/pyqt/2009-April/022809.html

PyQt4 - RuntimeError: базовый объект C/C был удален

Вложенные классы PyQt4 - RuntimeError: базовый объект C/C++ имеет удалено

PyQt: RuntimeError: обернутый объект C/C++ был удален

Каждый из моих подклассов вызывает метод super(), поэтому базовые классы построены правильно.

Тем не менее, я получаю эту ошибку, и мне интересно, связано ли это с тем, что я добавляю виджет QComboBox к QTreeWidgetItem (используя метод setItemWidget() для QTreeWidget), но я не могу установить родителя как QTreeWidgetItem, который его содержит. Когда я пытаюсь, я получаю следующую ошибку:

TypeError: QComboBox(QWidget parent=None): argument 1 has unexpected type 'QTreeWidgetItem'

Конечно, я могу либо опустить родителя в конструкторе, либо передать QTreeWidget в качестве родителя, но я думаю, что мне нужно указать правильный родитель.

Я создал подкласс QComboBox, и в моем подклассе он выполняет некоторые основные операции над QTreeWidget, но как только я ввожу методы моего подкласса QComboBox, базовый объект C для родительского QTreeWidgetItem, содержащий QComboBox, удаляется (именно поэтому я я думаю, что это как-то связано с настройкой родителя QComboBox).

Я понимаю, что в 9 случаях из 10 ошибка времени выполнения связана с отсутствием построения базового класса. Но если это исключено, как еще может возникнуть ошибка? Может ли это быть связано с тем, что не указан правильный родитель?

ИЗМЕНИТЬ

Я использую QComboBox, чтобы сигнализировать, когда был сделан новый выбор со списком. При новом выборе он добавляет это выбранное значение в XML-узел PyXB. Интересно, что эта проблема возникает только в том случае, если я добавляю значение к привязке класса PyXB, постоянно сохраняя информацию в файле XML. Другими словами, если эта часть кода не запускается, я не получаю ошибку - только когда код запускает операцию PyXB для добавления значения к привязке узла XML...


person ecoe    schedule 29.01.2014    source источник
comment
Пожалуйста, предоставьте минималистичный рабочий пример, чтобы продемонстрировать проблему. Нет большой надежды решить вашу проблему, не увидев полный рабочий пример.   -  person three_pineapples    schedule 30.01.2014
comment
Да, я согласен, но к тому времени, когда я почти собрал краткий рабочий пример, я понял, что решение было того же хода мыслей, что и ответ xndrme. Мой код большой, и поэтому вместо того, чтобы давать подробное объяснение, достаточно сказать, что вы всегда должны сохранять ссылку, особенно на виджет абсолютного верхнего уровня иерархии (именно этого не хватало в моем случае). .   -  person ecoe    schedule 31.01.2014
comment
Да, я думал, что это может оказаться так. Ошибка, которую вы видели, как правило, всегда связана с тем, что вы не сохранили ссылку где-то там, где должны были. Рад, что вы разобрались :)   -  person three_pineapples    schedule 31.01.2014


Ответы (1)


Я обычно избегаю таких ошибок, сохраняя ссылку на мой класс на все объекты, которые могут быть удалены, такие как ваш QComboBox, поэтому попробуйте что-то вроде self.comboBoxHolder = QComboBox(...) при его создании.

person Alvaro Fuentes    schedule 29.01.2014
comment
Спасибо, но я создаю подкласс QComboBox. Я думаю, что ваше решение сработает, но проблема не в том, что мой подкласс удаляется, а в базовом объекте C, который он расширяет... Я пробовал это, и это не сработало - все равно дал +1, хотя это был хорошая идея, чтобы проверить еще раз спасибо. - person ecoe; 30.01.2014
comment
После попытки создать краткий рабочий пример в соответствии с рекомендацией three_pineapples я понял, что ваше решение было общим ответом на эту проблему; мой QMainWindow (самый высокоуровневый виджет) был создан, и ссылка на него не была сохранена даже как локальная переменная. Буквально я сделал QMainWindow().begin_rest_of_app(). Все, что мне было нужно, это просто: main = QMainWindow(), а затем main.begin_rest_of_app(). Спасибо еще раз. - person ecoe; 31.01.2014