【发布时间】:2016-10-24 17:43:22
【问题描述】:
在使用 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类的代码。