2014-01-29 6 views
1

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

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

PyQt4 - "RuntimeError: underlying C/C object has been deleted"

PyQt4 nested classes - "RuntimeError: underlying C/C++ object has been deleted"

PyQt: RuntimeError: wrapped C/C++ object has been deleted

Каждый из моих подклассов называет 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 ошибка времени выполнения из-за не построения базового класса. Но с этим исключено, как иначе может произойти ошибка? Может быть, из-за не ссылки на правильный родитель?

EDIT

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

+1

Просьба представить минималистический рабочий пример, чтобы продемонстрировать проблему. Существует не так много надежды на решение вашей проблемы, не видя полного рабочего примера. –

+1

Да, я согласен, но к тому времени, когда я чуть ли не собрал краткий рабочий пример, я понял, что решение имеет тот же ход мысли, что и ответ xndrme. Мой код большой, и поэтому вместо того, чтобы давать подробное объяснение этому, достаточно сказать, что вы всегда должны сохранять ссылку, особенно абсолютного виджета верхнего уровня на уровне иерархии (чего и не было в моем случае) , – ecoe

+0

Да, я думал, что это может быть так. Ошибка, которую вы видели, обычно всегда, потому что вы не сохранили ссылку где-нибудь там, где должны были быть. Рад, что вы его отсортировали :) –

ответ

2

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

+0

Спасибо, но я подклассифицирую QComboBox.Я думаю, что вы будете работать, но проблема заключается не в том, что мой подкласс удаляется - его основной объект C, из которого он распространяется ... Я пробовал это, и он не работал - все равно дал +1, хотя это был хорошая идея снова проверить благодарность. – ecoe

+1

ОК, если я выясню другую идею, я отправлю ее;) –

+0

После попытки составить краткий рабочий пример в рекомендации three_pineapples, я понял, что ваше решение было общим ответом на эту проблему; мой QMainWindow (большинство виджета верхнего уровня) был построен, и ссылка на него не была сохранена как даже локальная переменная. Буквально я сделал QMainWindow(). Begin_rest_of_app(). Все, что мне было нужно, было простым: main = QMainWindow(), а затем main.begin_rest_of_app(). Еще раз спасибо. – ecoe