У меня возникают проблемы со ссылками на объекты при использовании QLayout для размещения виджетов в большом окне рядом друг с другом.
у меня следующая ситуация
class MyClass(QObject):
widgetCollection = []
def spawn(self):
widget = MyQWidget() #containing a QLineWidget called "nameEdit"
self.widgetCollection.append(widget)
self._window = QtGui.QWidget()
layout = QtGui.QHBoxLayout()
listView = QtGui.QListWidget()
for equation in self.wigdetCollection:
equationName = equation.nameEdit.text()
item = QtGui.QListWidgetItem(equationName)
listView.addItem(item)
layout.addWidget(listView)
layout.addWidget(widget)
self._window.setWindowTitle("Equation Editor")
self._window.setLayout(layout)
self._window.show()
def respawn(self):
self.spawn()
Каждый раз, когда я вызываю spawn(), я хочу добавить в коллекцию новый виджет. Кроме того, я хочу открыть новое окно, в котором есть ListView со всеми именами виджетов слева и недавно созданным виджетом справа.
Теперь первый вызов метода spawn() работает, как и ожидалось. Но второй вызов вызывает исключение:
equationName = widget.nameEdit.text()
RuntimeError: wrapped C/C++ object of type QLineEdit has been deleted
Я думаю, что это как-то связано с линией
layout.addWidget(widget)
Я где-то читал, что макет становится владельцем виджета при добавлении в качестве элемента. При этом я теряю виджет, как только выхожу за рамки ссылки на макет (которая в данном случае является локальной). Так что кажется, что элемент виджета в моей коллекции тоже удаляется.
Кто-нибудь может помочь? Как мне это предотвратить.
MyQWidget
. - person ekhumoro   schedule 23.10.2016