2010-11-07 11 views
6

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) 

cevap

2

ben için nasıl uygulanacağı varken bu bölümünü de başımı yaptığını hatırlıyorum, denemek ve bazı ipuçları vereceğiz: Burada

kullanıyorum kod bir örnektir benim uygulamam! o burada değil ... Evet seni biraz yardımcı olacağını umuyoruz http://doc.qt.io/archives/qt-4.7/qabstractitemmodel.html#insertRows

:

virtual bool insertRows(int Row, int Count, const QModelIndex& rParent); 
virtual bool removeRows(int Row, int Count, const QModelIndex& rParent = QModelIndex()); 

bool SuperModel::insertRows(int Row, int Count, const QModelIndex& rParent) 
{ 
... 
    // On débute l'insertion des lignes. 
    beginInsertRows(rParent, Row, Row + Count -1); 
    // ... Perform insertion here, you'll have something like 
    pParent->addChild(Row); 
    endInsertRows(); 
} 

bool SuperModel::removeRows(int Row, int Count, const QModelIndex& rParent) 
{ 
    ... 
    beginRemoveRows(rParent, Row, Row + Count -1); 
    // ... Perform removing here, you'll have something like 
    pParent->removeChild(Row); 
    endRemoveRows(); 
} 

Biraz daha bilgiler: Hatırladığım kadarıyla

Yani, aşağıdaki sanal yöntemleri uygulamak zorunda PyQt ama umarım size bazı ipuçları verecektir ...

+0

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

+0

Kötü! İyi iş! –