【Python】QTreeWidget树形结构添加

源码:

# 参考网址: https://blog.csdn.net/weixin_42286052/article/details/129532631
import os.path
import sys
from PySide6.QtWidgets import QApplication,QMainWindow,QHBoxLayout,QVBoxLayout,QPushButton,QTreeWidget,QTreeWidgetItem,QTreeWidgetItemIterator
from PySide6.QtGui import QStandardItemModel,QStandardItem
from QTreeWidgetUi import Ui_MainWindow
from PySide6.QtCore import Qt,QAbstractItemModel
import configparser

class ParseNone():
    def __init__(self,fileName):
        self.config_path = os.path.join(os.path.dirname(__file__), fileName)
        self.config_ini = configparser.ConfigParser()
        self.config_ini.read(self.config_path,encoding="utf-8")


# parser = ParseNone("config.ini")



class TreeWidgetDemo(QMainWindow,Ui_MainWindow):
    def __init__(self, parent=None):
        super(TreeWidgetDemo, self).__init__(parent)
        self.setWindowTitle('TreeWidget 例子')
        self.setupUi(self)
        self.Listener()

        self.config = ParseNone("config.ini")

        self.tree = self.treeWidget
        self.tree.setHeaderLabels(['中国省份城市'])
        # 设置列数
        self.tree.setColumnCount(1)
        self.tree.setColumnWidth(0, 100)

        self.preview = QTreeWidgetItem(self.tree)  # 实例化一个项目。参数:指定父类
        self.preview.setText(0, '中国')
        self.preview.setCheckState(0, Qt.Unchecked)

        for root in self.config.config_ini.sections():
            items = self.config.config_ini.items(root)
            parent = QTreeWidgetItem(self.preview)
            parent.setText(0, root)
            parent.setCheckState(0, Qt.CheckState.Unchecked)
            for item in items:
                node = QTreeWidgetItem(parent)
                node.setText(0,item[1])
                node.setCheckState(0,Qt.Unchecked)
        # 参数1 复选框的位置 列序号
        # Qt.Unchecked   没选中
        # Qt.Checked    选中
        # Qt.PartiallyChecked   部分选中

        # self.tree.expandAll()
        # 让所有的项都是以打开状态显示的。注意必须要在所有项都已经实例化好之后再调用该方法,如果一开始就调用则会没有效果

        self.tree.itemClicked.connect(self.handleChanged)

    # def handleChanged(self, item, column):
    #     count = item.childCount()
    #     if item.checkState(column) == Qt.CheckState.Checked:
    #         for i in range(count):
    #             if item.child(i).checkState(0) != Qt.CheckState.Checked:
    #                 item.child(i).setCheckState(0,Qt.CheckState.Checked)
    #
    #     if item.checkState(column) == Qt.CheckState.Unchecked:
    #         for i in range(count):
    #             if item.child(i).checkState(0) != Qt.CheckState.Unchecked:
    #                 item.child(i).setCheckState(0,Qt.CheckState.Unchecked)

    def updateParentItems(self,item,column):
        parent = item.parent()
        if parent == None: return
        parent.setCheckState(column, item.checkState(column))
        count = parent.childCount()
        for i in range(count):
            child = parent.child(i)
            if child.checkState(column) != parent.checkState(column):
                parent.setCheckState(column, Qt.CheckState.PartiallyChecked)
                break

        self.updateParentItems(parent, column)

    def updateChildItems(self, item, column):
        count = item.childCount()
        for i in range(count):
            child = item.child(i)
            child.setCheckState(column,item.checkState(column))
            if child.childCount() > 0:
                self.updateChildItems(child, column)

    def handleChanged(self, item, column):
        # 注意,一定要先设置子节点,在设置父节点,不然现象比较奇怪
        self.updateChildItems(item, column)
        self.updateParentItems(item, column)
        self.GetSelectedNode(item, column)

    def GetSelectedNode(self,item, column):
        iterator = QTreeWidgetItemIterator(item)
        while iterator.value():
            item = iterator.value()
            # print(item.parent())
            if item.checkState(column) == Qt.CheckState.Checked:
                print(item.text(column))
                pass
            iterator +=1

    def traverse(self):
        """遍历节点"""
        n = self.treeWidget.topLevelItemCount()  # 获取根节点数量
        for i in range(0, n):
            item = self.treeWidget.topLevelItem(i)  # 循环获取根节点
            text = item.text(0)  # 根节点文字信息(默认一列)

            count = item.childCount()  # 获取当前根节点的子节点数量
            if count != 0:
                for j in range(0, count):
                    string = item.child(j).text(0)  # 子节点的文字信息
                    print(string)

    def Listener(self):
        # 按钮的信号槽连接
        self.pushButton_add.clicked.connect(self.addTreeNodeBtn)
        self.pushButton_del.clicked.connect(self.delTreeNodeBtn)
        self.pushButton_modify.clicked.connect(self.updateTreeNodeBtn)


    def onTreeClicked(self, qmodelindex):
        item = self.tree.currentItem()
        print("key=%s ,value=%s" % (item.text(0), item.text(1)))

    def addTreeNodeBtn(self):
        item = self.tree.currentItem()
        print(item.parent(), item.childCount())
        node = QTreeWidgetItem(item)
        node.setText(0, 'newNode')
        node.setText(1, '10')

    def updateTreeNodeBtn(self):
        print('--- updateTreeNodeBtn ---')
        item = self.tree.currentItem()
        item.setText(0, 'updateNode')
        item.setText(1, '20')

    def delTreeNodeBtn(self):
        print('--- delTreeNodeBtn ---')
        item = self.tree.currentItem()
        root = self.tree.invisibleRootItem()
        for item in self.tree.selectedItems():
            (item.parent() or root).removeChild(item)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    tree = TreeWidgetDemo()
    tree.show()
    sys.exit(app.exec())

[中国]
node1 = 北京
node2 = 上海
node3 = 重庆
node4 = 天津
node5 = 广东

[广东]
node1 = 广州
node2 = 深圳
node3 = 东莞

[贵州]
node1 = 贵阳
node2 = 遵义
node3 = 安顺

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PythonQt框架提供了一种方便的可视化控件,即QTreeWidget,用于创建基于树状结构的项目列表。每个项目都是一个QTreeWidgetItem对象,它可以包含子项目并且可以扩展或折叠以显示和隐藏其子项目。 QTreeWidgetItem本身是可编辑的,这意味着用户可以直接在控件中编辑文本内容。要使QTreeWidgetItem可编辑,可以使用setFlags()方法来设置编辑标志。可以将Qt.ItemIsEditable标志添加到项的标志中。 例如,以下代码段创建一个可编辑的QTreeWidget项目: ``` from PyQt5.QtWidgets import * app = QApplication([]) treeWidget = QTreeWidget() root = QTreeWidgetItem(treeWidget, ['Root item']) # Add a child item child1 = QTreeWidgetItem(root, ['Child item 1']) # Set child item as editable child1.setFlags(child1.flags() | Qt.ItemIsEditable) # Show the tree widget treeWidget.show() app.exec_() ``` 在上述代码中,我们创建了一个树状结构,包括一个根项和一个子项。我们使用setFlags()方法将子项标记为可编辑。当用户单击子项以编辑它时,会在界面上显示一个文本框,允许用户编辑文本内容。 总的来说,QTreeWidgetItem的可编辑特性非常有用,可以使用户直接在控件中进行编辑,而不必打开独立的编辑界面。这为用户提供了一种更为直观的操作方式,使得应用程序更加易于使用和维护。 ### 回答2: Python qtreewidgetitem是一种可以用来在PyQt5编程框架中创建可编辑的树形控件的类。通过使用这个类,你可以创建一个树形表格,包含多列数据,每一列都可以被编辑。 在qtreewidgetitem中,你可以创建子节点,使得整个树形控件非常多层次化。它还可以访问并控制树形控件的各种属性,如样式、显示项等。你可以定义树形控件中每一个项目所拥有的属性,如文本、图像、状态等信息。 qtreewidgetitem也支持树形控件中项目的拖拽、移动、删除等操作。你可以在树形控件中编辑单元格的内容,完成数据的输入和修改。 总结来说,Python qtreewidgetitem是一种非常强大的树形控件类,可以帮助你创建可编辑的树形表格,同时也支持多种操作。在PyQt5编程中,qtreewidgetitem是一个值得学习和掌握的类。 ### 回答3: python中的QTreeWidgetItem是一种可以用于显示层级结构的小部件。它可以用来创建一个树形结构的列表,每一个元素都有自己的子节点。而QTreeWidgetItem的可编辑性,指的是用户可以直接在该小部件中编辑每个节点的文本。在默认情况下,QTreeWidgetItem是不可编辑的。如果想要让他可编辑,我们可以通过设置QTreeWidgetItem的属性值来实现。代码如下: ```python # 导入需要的类 from PyQt5.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem # 创建一个树形窗口 app = QApplication([]) tree = QTreeWidget() # 创建几个根节点 root1 = QTreeWidgetItem(None, ["根节点1", "4", "1.2"]) root2 = QTreeWidgetItem(None, ["根节点2", "3", "5.2"]) root3 = QTreeWidgetItem(None, ["根节点3", "5", "3.8"]) # 添加子节点 child1 = QTreeWidgetItem(root1, ["子节点1", "2", "7.1"]) child2 = QTreeWidgetItem(root2, ["子节点2", "5", "2.2"]) child3 = QTreeWidgetItem(root3, ["子节点3", "1", "5.8"]) # 设置可编辑属性 tree.editItem(child1) # 显示树形窗口 tree.show() app.exec() ``` 在上面的代码中,我们先创建了一个QTreeWidget,然后创建了三个根节点和三个子节点,并将它们添加QTreeWidget中。接着,我们通过调用`tree.editItem(child1)`函数,将子节点child1设置为可编辑状态。这样用户就可以直接在程序中编辑树形列表节点的文本信息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值