QTreeWidgetItem.insertChild位于索引0

问题描述

我正在尝试在项目组的顶部插入新的子项目。索引值似乎不被接受,并且该项目转到列表的末尾。我在QTreeWidgets中搜索并没有找到很多针对此类操作的命中方法。我确实找到了一个可以进行实验的简单程序:

"""
simple test of treewidget
"""
import sys
from pyside2 import QtWidgets

class Testclass():
    """
    test
    """
    def __init__(self):
        """
        test
        """
        app = QtWidgets.QApplication(sys.argv)
        window = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout(window)

        trw = QtWidgets.QTreeWidget()
        trw.setHeaderLabels(['Name','Date','Cost ($)'])
        chg = QtWidgets.QTreeWidgetItem(trw,['carrots',None,None])
        datrows = [[None,'2020-00-00','0.33'],[None,'0.35'],'0.36']]
        for datrow in datrows:
            __ = QtWidgets.QTreeWidgetItem(chg,datrow)
        __ = chg.insertChild(0,QtWidgets.QTreeWidgetItem(chg,'0.30']))


        layout.addWidget(trw)
        window.show()
        sys.exit(app.exec_())

Testclass()

我在树形控件中更改了父级引用,并更改了索引。它添加一个空白项目,然后在末尾添加了新项目。我唯一想要的效果获取所有项目,将新项目添加到列表顶部并重建树:

"""
simple test of treewidget
"""
import sys
from pyside2 import QtWidgets

class Testclass():
    """
    test
    """
    def __init__(self):
        """
        test
        """
        app = QtWidgets.QApplication(sys.argv)
        window = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout(window)

        trw = QtWidgets.QTreeWidget()
        trw.setHeaderLabels(['Name',datrow)
        chi_list = []
        for chgiix,chgii in enumerate(QtWidgets.QTreeWidgetItemIterator(chg)):
            chg_item = chgii.value()
            if chgiix:
                coldata = []
                for colix in range(chg_item.columnCount()):
                    coldata.append(chg_item.text(colix))
                chi_list.append(coldata)
        chi_list.insert(0,'0.30'])
        _ = trw.taketopLevelItem(0)
        chg = QtWidgets.QTreeWidgetItem(trw,None])
        for datrow in chi_list:
            __ = QtWidgets.QTreeWidgetItem(chg,datrow)
        print(chi_list)
        layout.addWidget(trw)
        window.show()
        sys.exit(app.exec_())

Testclass()

有更好的方法吗?

解决方法

问题是您使用了错误的构造函数,例如根据您使用的代码this constructor

QTreeWidgetItem :: QTreeWidgetItem(QTreeWidgetItem * parent,const QStringList&strings,int类型=类型)
构造一个树部件 并将其附加到给定的父级。给定的字符串列表将是 设置为项目中每一列的项目文本。

也就是说,通过QtWidgets.QTreeWidgetItem(chg,[None,'2020-00-00','0.30']),您已经将该项附加为“ chg”的子项。

然后insertChild()指出:

无效QTreeWidgetItem :: insertChild(int index,QTreeWidgetItem * child)
将子项插入子项列表中的索引处。

如果孩子已经被插入其他地方,则不会 再次插入。

(重点是我的)

也就是说,作为“ chg”的子代,则不会将其插入开头。

解决方案不是传递“ chg”,而是使用this other constructor

QTreeWidgetItem :: QTreeWidgetItem(const QStringList&strings,int type = 类型)
构造指定类型的树小部件项。该项目 必须插入到树小部件中。给定的字符串列表将是 设置为项目中每一列的项目文本。

import sys
from PySide2 import QtWidgets


class Testclass:
    def __init__(self):
        app = QtWidgets.QApplication(sys.argv)
        window = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout(window)

        trw = QtWidgets.QTreeWidget()
        trw.setHeaderLabels(["Name","Date","Cost ($)"])
        chg = QtWidgets.QTreeWidgetItem(trw,["carrots",None,None])
        datrows = [
            [None,"2020-00-00","0.33"],"0.35"],"0.36"],]
        for datrow in datrows:
            QtWidgets.QTreeWidgetItem(chg,datrow)
        chg.insertChild(0,QtWidgets.QTreeWidgetItem([None,"0.30"]))

        layout.addWidget(trw)
        window.show()
        sys.exit(app.exec_())


Testclass()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...