首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PySide (PyQt) QAbstractItemModel

PySide (PyQt) QAbstractItemModel
EN

Stack Overflow用户
提问于 2012-12-28 20:25:01
回答 2查看 5.2K关注 0票数 6

我正在尝试为treeview实现一个简单的模型,但我不知道为什么它不起作用。我的所有节点似乎都是我的节点的子节点,尽管其中三个应该是它的first子节点的子节点。我还可以看到,我的hasChildren方法进入了一个无限循环。任何帮助都将不胜感激。

这是我的代码:

代码语言:javascript
复制
#!/usr/bin/env python2

from PySide import QtGui, QtCore
import sys

class SI(object):

    children = []

    def __init__(self, group=None, parent=None):
        self.parent = parent
        self.group = group

    def data(self, column):
        return self.group[column]

    def appendChild(self, group):
        self.children.append(SI(group, self))

    def child(self, row):
        return self.children[row]

    def childrenCount(self):
        return len(self.children)

    def hasChildren(self):
        if len(self.children) > 0 :
            return True
        return False

    def row(self):
        if self.parent:
            return self.parent.children.index(self)
        return 0

    def columnCount(self):
        return len(self.group)

class SM(QtCore.QAbstractItemModel):

    root = SI(["First", "Second"])

    def __init__(self, parent=None):
        super(SM, self).__init__(parent)
        self.createData()

    def createData(self):
        for x in [["a", "A"], ["b","B"], ["c", "C"]]:
            self.root.appendChild(x)
        for y in [["aa", "AA"], ["ab", "AB"], ["ac","AC"]]:
            self.root.child(0).appendChild(y)

    def columnCount(self, index=QtCore.QModelIndex()):
        if index.isValid():
            return index.internalPointer().columnCount()
        else:
            return self.root.columnCount()

    def rowCount(self, index=QtCore.QModelIndex()):
        if index.row() > 0:
            return 0
        if index.isValid():
            item = index.internalPointer()
        else:
            item = self.root
        return item.childrenCount()

    def index(self, row, column, index=QtCore.QModelIndex()):
        if not self.hasIndex(row, column, index):
            return QtCore.QModelIndex()
        if not index.isValid():
            item = self.root
        else:
            item = index.internalPointer()

        child = item.child(row)
        if child:
            return self.createIndex(row, column, child)
        return QtCore.QMOdelIndex()

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

        parent = item.parent
        if parent == self.root:
            return QtCore.QModelIndex()
        else:
            return self.createIndex(parent.row(), 0, parent)

    def hasChildren(self, index):
        if not index.isValid():
            item = self.root
        else:
            item = index.internalPointer()
        return item.hasChildren()

    def data(self, index, role=QtCore.Qt.DisplayRole):
       if index.isValid() and role == QtCore.Qt.DisplayRole:
            return index.internalPointer().data(index.column())
       elif not index.isValid():
            return self.root.getData()

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

class MyTree(QtGui.QTreeView):
    def __init__(self, parent=None, model=SM):
        super(MyTree, self).__init__(parent)
        self.setModel(model())


class Window(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.initGui()

    def initGui(self):
       vlo = QtGui.QVBoxLayout()
       tree = MyTree(self)
       vlo.addWidget(tree)
       self.setLayout(vlo)
       self.show()

def main():
    app = QtGui.QApplication(sys.argv)
    win = Window()
    exit(app.exec_())

if __name__ == '__main__':
    main()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-16 08:25:14

嗯,我想你几乎把它从一个(奇怪)中分离出来了!弄错了。您可以在children中声明SI为类级变量,而它应该是一个实例变量,因为每个SI都可以有子变量。对于所有实例,您不需要一个单独的列表。

所以我把第一行改为:

代码语言:javascript
复制
class SI(object):


   def __init__(self, group=None, parent=None):
       self.parent = parent
       self.group = group
       self.children = []

   def data(self, column):
       return self.group[column]

一切似乎都正常。当然,我还没有进行详细的测试,但这应该会让你开始测试。

票数 8
EN

Stack Overflow用户

发布于 2015-06-15 22:43:01

在执行以下方面有一个错误:

代码语言:javascript
复制
def rowCount(self, index=QtCore.QModelIndex()):

而不是:

代码语言:javascript
复制
if index.row() > 0:

应该有:

代码语言:javascript
复制
if index.column() > 0:

来源:http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14075332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档