2013-12-13 62 views
1

我有一个项目树。它是这样的:QTreeView始终显示相同的数据

Categorias (root) 
- General 
--- Computadoras 
--- Tablets 
- Insumos 
--- Cartuchos 

的问题是,QTreeView正在用相同的信息总是完成。我得到一个树状图看起来像这样:

Categorias (root) 
- General 
--- General 
--- Insumos 
- Insumos 
--- General 

我已经把“打印”在index()方法,以查看是否该指数是被创建,然后,当我输入,例如“一般“类别,创建”Computadoras“和”平板电脑“的索引,但是那个时候!然后,显示的数据是错误的!任何想法?

我给你我的树视图的实现。什么等于Qt教程之一?

def buildTree(categorias, parentTree, step): 
    for categoria in categorias: 
     #print "-"*step, categoria.descripcion 
     newTreeItem = CategoriasTreeItem(categoria, parentTree) 
     parentTree.appendChild(newTreeItem) 
     if len(categoria.subCategorias) > 0: 
      buildTree(categoria.subCategorias, newTreeItem, step + 1) 


class CategoriasProductoTableModel(QtCore.QAbstractTableModel): 
    def __init__(self, session): 
     QtCore.QAbstractTableModel.__init__(self) 
     self.session = session 
     self.rootItem = CategoriasTreeItem() 

    def updateData(self): 
     categorias = self.session.query(CategoriaProducto).filter(CategoriaProducto.idCategoriaSuperior == None).all() 
     #print [len(categoria.subCategorias) for categoria in categorias] 
     buildTree(categorias, self.rootItem, 1) 
     #c = self.rootItem.child(0) 
     #print [i.data(0) for i in c.childItems] 
     self.modelReset.emit() 

    def setData(self, index, value, role): 
     if index.isValid() and role == QtCore.Qt.EditRole: 
      # implementar los seteos aca 
      return True 
     else: 
      return False 

    def columnCount(self, parent): 
     if parent.isValid(): 
      return parent.internalPointer().columnCount() 
     else: 
      return self.rootItem.columnCount() 

    def data(self, index, role): 
     if not index.isValid(): 
      return None 
     if role != QtCore.Qt.DisplayRole: 
      return None 

     item = index.internalPointer() 
     return item.data(index.column()) 

    def flags(self, index): 
     if not index.isValid(): 
      return QtCore.Qt.NoItemFlags 

     return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable 

    def headerData(self, section, orientation, role): 
     if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: 
      return self.rootItem.data(section) 

    def index(self, row, column, parent): 
     #if row < 0 or column < 0 or row >= self.rowCount(parent) or column >= self.columnCount(parent): 
     if not self.hasIndex(row, column, parent): 
      return QtCore.QModelIndex() 

     if not parent.isValid(): 
      parentItem = self.rootItem 
     else: 
      parentItem = parent.internalPointer() 

     childItem = parentItem.child(row) 
     if childItem: 
      return self.createIndex(row, column, childItem) 
     else: 
      return QtCore.QModelIndex() 

    def parent(self, index): 
     if not index.isValid(): 
      return QtCore.QModelIndex() 

     childItem = index.internalPointer() 
     parentItem = childItem.parent() 

     if parentItem == self.rootItem: 
      return QtCore.QModelIndex() 

     return self.createIndex(parentItem.row(), 0, parentItem) 

    def rowCount(self, parent): 
     if parent.column() > 0: 
      return 0 

     if not parent.isValid(): 
      parentItem = self.rootItem 
     else: 
      parentItem = parent.internalPointer() 

     return parentItem.childCount() 
+0

这是Python的Qt(PyQt | PySide)吗? – Korchkidu

+0

yap,PySide实际上 –

+0

我看到你的代码使用了一个数据库。您能否创建一小段代码来说明可以在其他计算机上轻松粘贴和运行的问题?这将有助于找出问题。 –

回答

0

从评论由克里斯蒂安·佩雷斯

我看到了,我是从QAbstractTABLEModel而不是继承化QAbstractItemModel。当我改变它的时候,它工作。

+0

使用'QAbstractTableModel'的'QTreeView'的最近线程在这里:http://stackoverflow.com/questions/27308309/display-data-from-qabstracttablemodel-in-qtreeview – neuronet