Bir QAbstractItemModel kullanarak bir ağaç görünümünü yönetmek için PyQt kullanıyorum. Şimdiye kadar, verileri yükleyebildiğim, genişletip daraltmak ve değerleri düzenlemek için başarılı bir şekilde uygulayabildim.pyqt: QAbstractDataModel ve QTreeView için eklemeleri anlamaya çalışıyorum
Yapamayacağım bir şey, kafamı satırları takıp çıkarmaktır. Yapmak çalışıyorum ne
Kısa versiyon:
kullanıcı belirli bir hücre düzenler
, aslında benim nesne hiyerarşide altta yatan öğeyi silmek ve farklı bir ile değiştirmeniz gerekir. Bunu modelimin setData yönteminde uygularım. Ne yaptığımı tam olarak anlamadığımdan, onu ayarlamış görünüyordum ki, bu yüzden segfaultlar.Temel olarak, veri modelinin QModelIndex ile nasıl etkileşime girdiğinin daha iyi anlaşılmasına ihtiyacım var, ancak belgelerin okunması ve yeniden okunması bana aydınlatıcı görünmüyor. Herhangi bir yardım (ya da iyi bir öğretici için herhangi bir bağlantı - tercihen, python içinde olmasa da - büyük ölçüde takdir edilecektir).
#---------------------------------------------------------------------------
def setData(self, index, value, role=QtCore.Qt.EditRole):
"""
Sets the data.
"""
if index.isValid() and (0 <= index.row() < self.rowCount()):
item = index.internalPointer()
value = value.toString()
if index.column() == 5:
# rip out the current object and replace it with a new one of
# the correct datatype.
#next 4 lines get info from my underlying hierarchy of objects
dataType = str(value)
parent = item.get_parent()
name = item.get_name()
row = parent.get_row_of_child(name)
#assuming everything is ok, I now am trying to manage the
#underlying objects
if row != None:
#I am calling this because I think I need to, but don't
#really know if it is called for here or not
self.beginInsertRows(self.parent(index), row, 1)
#Next 3 lines create and initialize a new underlying
#object that will be inserted.
newItem = self.root.create_template_param_obj(dataType,
name,
parent)
newItem.set_index(row)
newItem.set_default_value(item.get_default_value())
#now I remove the old object from my underlying
#hierarchy and insert the new one
parent.remove_child_at_row(row)
parent.insert_child_at_row(newItem, row)
#this is where I get lost. I *think* I need to point to
#the new underlying object (i.e. rebuild the index)
#so I am going to call the data model's index method.
#But that needs the index of the parent, so first I
#call the data model's parent method to get the index
#of the parent. But this code segfaults (I think it
#is the treeview that actually freaks out because this
#setData method completes properly before the whole thing
#crashes. Does anyone have a pointer to a decent tutorial
#that will explain how data models and mode indexes work?
self.index(row, 5, self.parent(index))
self.endInsertRows()
self.emit(QtCore.SIGNAL("dataChanged(QModelIndex,QModelIndex)"),
index, index)
return True
#Ignore any role other than the edit role
return False
#---------------------------------------------------------------------------
def index(self, row, column, parent):
"""
Connect the data model to the actual object hierarchy.
"""
if not self.hasIndex(row, column, parent):
return QtCore.QModelIndex()
if not parent.isValid():
parentItem = self.root
else:
parentItem = parent.internalPointer()
childItem = parentItem.get_child_at_row(row)
if childItem:
return self.createIndex(row, column, childItem)
else:
return QtCore.QModelIndex()
#---------------------------------------------------------------------------
def parent(self, index):
"""
Returns a QModelIndex of the parent
"""
if not index.isValid():
return QtCore.QModelIndex()
childItem = index.internalPointer()
if not childItem:
return QtCore.QModelIndex()
parentItem = childItem.get_parent()
if parentItem == self.root:
return QtCore.QModelIndex()
return self.createIndex(parentItem.get_index(), 0, parentItem)
Andy, öyleydi. Teşekkürler. Senin yardımınla, iki yöntem olmadan çalışmayı bile başarabiliyordum. Sadece çağırmak için ihtiyacım vardı: self.beginRemoveRows (self.parent (index), row, row) satırı kaldırmadan önce ve self.endRemoveRows() sonra. Yeni nesneyi eklemekle aynı. Şu an çok açık görünüyor ama yardımın olmadan anlayamadım. Tekrar teşekkürler! – bvz
Kötü! İyi iş! –