索引 0 处的 QTreeWidgetItem.insertChild

Posted

技术标签:

【中文标题】索引 0 处的 QTreeWidgetItem.insertChild【英文标题】:QTreeWidgetItem.insertChild at index 0 【发布时间】:2021-02-01 09:36:27 【问题描述】:

我正在尝试在项目组的顶部插入一个新的子项目。索引值似乎没有被兑现,并且该项目进入列表的末尾。我在 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, '2020-00-00', '0.35'],
                   [None, '2020-00-00', '0.36']]
        for datrow in datrows:
            __ = QtWidgets.QTreeWidgetItem(chg, datrow)
        __ = chg.insertChild(0, QtWidgets.QTreeWidgetItem(chg, [None, '2020-00-00', '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', 'Date', 'Cost ($)'])
        chg = QtWidgets.QTreeWidgetItem(trw, ['carrots', None, None])
        datrows = [[None, '2020-00-00', '0.33'],
                   [None, '2020-00-00', '0.35'],
                   [None, '2020-00-00', '0.36']]
        for datrow in datrows:
            __ = QtWidgets.QTreeWidgetItem(chg, 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, [None, '2020-00-00', '0.30'])
        _ = trw.takeTopLevelItem(0)
        chg = QtWidgets.QTreeWidgetItem(trw, ['carrots', None, None])
        for datrow in chi_list:
            __ = QtWidgets.QTreeWidgetItem(chg, datrow)
        print(chi_list)
        layout.addWidget(trw)
        window.show()
        sys.exit(app.exec_())

Testclass()

有没有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

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

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

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

然后正如insertChild() 指出的那样:

void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child) 在子列表的索引处插入子项。

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

(强调我的)

也就是说,作为“chg”的孩子,那么它就不会被插入到开头。

解决方法不是通过“chg”而是使用this other constructor:

QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type = 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"],
            [None, "2020-00-00", "0.35"],
            [None, "2020-00-00", "0.36"],
        ]
        for datrow in datrows:
            QtWidgets.QTreeWidgetItem(chg, datrow)
        chg.insertChild(0, QtWidgets.QTreeWidgetItem([None, "2020-00-00", "0.30"]))

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


Testclass()

【讨论】:

谢谢。我没有研究过所有不同的构造函数,没有考虑过它们/

以上是关于索引 0 处的 QTreeWidgetItem.insertChild的主要内容,如果未能解决你的问题,请参考以下文章

如何替换python列表特定索引处的值?

读取向量指针索引处的元素

区分 UITableView 中索引 0 处的无选择和选择

对给定索引处的接口使用“new”修饰符,例如“var b = new ISomeInterface[0];”,这是啥意思?

java.lang.IllegalArgumentException:索引 0 处的方案中存在非法字符:localhost

模块上下文中提供了如何修复索引 [0] 处的 AXIOS_INSTANCE_TOKEN