索引0处的QTreeWidgetItem.insertChild

2024-10-03 11:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在项目组的顶部插入一个新的子项目。该索引值似乎没有得到尊重,该项将转到列表的末尾。我在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()

有更好的方法吗


Tags: intestimportnoneforsyswindowlist
1条回答
网友
1楼 · 发布于 2024-10-03 11:22:54

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

QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type = Type)
Constructs a tree widget item and append it to the given parent. The given list of strings will be set as the item text for each column in the item.

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

然后正如^{}所指出的:

void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child)
Inserts the child item at index in the list of children.

If the child has already been inserted somewhere else it won't be inserted again.

(强调矿山)

也就是说,作为“chg”的子级,它将不会在开头插入

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

QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type = Type)
Constructs a tree widget item of the specified type. The item must be inserted into a tree widget. The given list of strings will be set as the item text for each column in the item.

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()

相关问题 更多 >