Мне бы очень хотелось знать, почему, со мной это тоже случается.
Похоже, "базовый объект C / C ++ был удален" для itemWidget. Вот что я получаю в любом случае, когда пытаюсь установить setItemWidget () снова после исчезновения виджета в надежде, что это исправит это.
Я добавляю событие для вызова при удалении QTreeWidgetItem, но кажется, что объект удаляется сразу после его удаления
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class InlineEditor (QWidget):
_MUTE = 'MUTE'
def __init__ (self, parent):
QWidget.__init__ (self, parent)
self.setAutoFillBackground (True)
lo = QHBoxLayout()
lo.setSpacing(4)
self._cbFoo = QComboBox()
for x in ["ABC", "DEF", "GHI", "JKL"]:
self._cbFoo.addItem(x)
self._leBar = QLineEdit('', self)
lo.addWidget (self._cbFoo, 3)
lo.addSpacing (5)
lo.addWidget (QLabel ( 'Bar:'))
lo.addWidget (self._leBar, 3)
lo.addStretch (5)
self.setLayout (lo)
class Tree(QTreeWidget):
def __init__(self, parent=None):
QTreeWidget.__init__(self, parent)
# Here is the issue?
self.setDragDropMode(QAbstractItemView.InternalMove)
self.installEventFilter(self)
self.setColumnCount(3)
for n in range (2):
i = QTreeWidgetItem (self) # create QTreeWidget the sub i
i.setText (0, "first" + str (n)) # set the text of the first 0
i.setText (1, "second")
for m in range (2):
j = QTreeWidgetItem(i)
j.setText (0, "child first" + str (m))
#b1 = QCheckBox("push me 0", tree) # this wont work w/ drag by itself either
#tree.setItemWidget (tree.topLevelItem(0).child(1), 1, b1)
self.item = InlineEditor(self) # deal with a combination of multiple controls
self.setItemWidget(self.topLevelItem(0).child(1), 1, self.item)
def eventFilter(self, sender, event):
if event.type() == QEvent.ChildRemoved:
print self.item._cbFoo # looks like this remains
print self.item._cbFoo.currentText() # CRASH! but the data is gone
#self.setItemWidget(self.topLevelItem(0).child(1), 1, self.item)
return False
class Form (QDialog):
def __init__(self,parent=None):
QDialog.__init__(self, parent)
grid = QGridLayout ()
tree = Tree ()
grid.addWidget (tree)
self.setLayout (grid)
app = QApplication ([])
form = Form ()
form.show ()
app.exec_ ()