Python 使用嵌套的QStandardItem在QStandardItemModel中追加列时的奇怪行为

Python 使用嵌套的QStandardItem在QStandardItemModel中追加列时的奇怪行为,python,qt,model-view-controller,pyqt,pyside,Python,Qt,Model View Controller,Pyqt,Pyside,我正在进行设置,需要通过QTreeView显示带有嵌套qstandarditem的QStandardItemModel。我需要添加和删除我似乎不知道如何正确执行的列 要插入初始嵌套行,我使用appendRow([item,item,…])并始终使用前一个项作为新的父项 最后一个QStandardItem的行和列计数意外为0,这可以在日志输出中看到 执行appendColumn()后,项目的列计数不会从3增加到4。而是在第0行第1列的索引处插入一个新项 在appendColumn()之前-列计

我正在进行设置,需要通过
QTreeView
显示带有嵌套
qstandarditem
QStandardItemModel
。我需要添加和删除我似乎不知道如何正确执行的列

  • 要插入初始嵌套行,我使用
    appendRow([item,item,…])
    并始终使用前一个项作为新的父项
  • 最后一个
    QStandardItem
    的行和列计数意外为0,这可以在日志输出中看到
  • 执行
    appendColumn()
    后,项目的列计数不会从3增加到4。而是在第0行第1列的索引处插入一个新项
appendColumn()
之前-列计数3

appendColumn()
之后,将显示新列,但列计数仍为3

示例代码
#-*-编码:utf-8-*-
从未来导入unicode文字
导入日志记录
导入系统
导入uuid
从PySide导入QtCore
从PySide导入QtGui
logging.basicConfig(级别=logging.DEBUG)
logger=logging.getLogger(_名称__)
类TestModel(QtGui.QStandardItemModel):
定义初始化(self,*args,**kwargs):
super(TestModel,self)。\uuuuuu init\uuuuuu(*args,**kwargs)
self.logger=logging.getLogger(类型(self)。\uuuuu名称\uuuuuuu)
def设置_数据(自身):
“”“用3个嵌套行填充,每个行有3列用于测试。”“”
#清理
self.clear()
self.setHorizontalHeaderLabels([“header_1”、“header_2”、“header_3”]))
#填充嵌套行
父项=无
对于范围(3)中的索引:
行=[QtGui.QStandardItem(str(uuid.uuid4().hex[:4]),用于范围(3)中的
self.appendRow(行)if(父级为None)else parent.appendRow(行)
父项=行[0]
def打印_行(自身):
“”“打印有关模型所有行的信息。”“”
对于self.all_index()中的索引:
item=self.itemFromIndex(索引)
msg=“QModelIndex:行{0}列{1}”
msg+=“QStandardItem:行计数{2}列计数{3}”
msg+=“值:{4}”
msg=msg.format(
index.row(),index.column(),
item.rowCount()、item.columnCount()、item.text())
self.logger.info(msg)
定义所有索引(自身,索引=无,索引=无):
“”“递归第一列索引下的所有索引并返回
将它们作为单一列表列出。
"""
指数=指数if(isinstance(指数,列表))else[]
index=索引if(isinstance(index,QtCore.QModelIndex))else QtCore.QModelIndex()
对于范围(self.rowCount(index))中的行:
当前索引=自索引(行,0,索引)
index.append(当前_索引)
if(self.haschilds(当前_索引)):
所有指数(指数、当前指数)
回报指数
def append_列(自身):
self.logger.info(“appendColumn()”)
self.appendColumn([QtGui.QStandardItem(str(uuid.uuid4().hex[:4]),]))
#试验
如果(\uuuuu name\uuuuuu==“\uuuuuu main\uuuuuu”):
app=QtGui.QApplication(sys.argv)
#小部件
widget=QtGui.QWidget()
layout=QtGui.QVBoxLayout()
widget.setLayout(布局)
widget.show()
#模型
model=TestModel()
model.set_data()
#看法
view=QtGui.QTreeView()
view.setModel(model)
layout.addWidget(视图)
#btn_打印_行
btn_print_rows=QtGui.QPushButton(“打印行”)
btn_打印_行。单击。连接(模型。打印_行)
layout.addWidget(btn\u打印\u行)
#btn_追加_列
btn_append_column=QtGui.QPushButton(“append column”)
btn\u追加列。单击。连接(model.append\u列)
layout.addWidget(btn\u append\u列)
sys.exit(app.exec_())
问题
  • 我得到了上一个
    QStandardItem
    的意外行和列计数,这可以在日志输出中看到。当模型清楚地显示似乎正确的数据时,为什么最后一项的行和列计数为0
  • 如何使用嵌套的
    qstandarditem
    (显示在
    QTreeView
    中)在
    QStandardItemModel
    中正确地添加/删除列
  • 我是否应该使用列计数等于标题项计数的
    QStandardItems
    ?(为每个新列取消/递增item.columnCount()。还是所有
    qstandarditem
    的列计数都应该为1