根据用户选择的列表动态填充treewidget

时间:2019-07-05 13:29:24

标签: python pyside2

我要寻找的是,每当用户选择一组对象时,这些对象将成为树层次结构中每个先前添加的对象的子对象。我在下面放了一个简单的工作示例,该示例模拟了三个单独的用户选择。仅正确添加了其中两个。当第三个选择应该与先前添加的每个对象作为父对象时,则仅将其作为最后一个对象的父对象。

示例 错误:

正确的育儿方式:

from PySide2 import QtCore, QtWidgets
import sys


app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(window)


treeWidget = QtWidgets.QTreeWidget()

userSelection = [['object1', 'object2', 'object3'], ['object1', 'object2', 'object3'], ['object1', 'object2', 'object3']]



treeWidgetsList=[]

for selection in userSelection:
    list_=[]
    for obj in selection:
        if not treeWidgetsList:
            treeWidgetItem = QtWidgets.QTreeWidgetItem(treeWidget, [obj])
            treeWidgetItem.setFlags(treeWidgetItem.flags() | QtCore.Qt.ItemIsTristate | QtCore.Qt.ItemIsUserCheckable) 

        else:
            for t in treeWidgetsList[-1]:
                treeWidgetItem = QtWidgets.QTreeWidgetItem(t, [obj])
                treeWidgetItem.setFlags(treeWidgetItem.flags() | QtCore.Qt.ItemIsUserCheckable)
                treeWidgetItem.setCheckState(0, QtCore.Qt.Unchecked)
        list_.append(treeWidgetItem)
    treeWidgetsList.append(list_)



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

2 个答案:

答案 0 :(得分:0)

好吧,我把您的代码放入了一个更python-pyqt的格式(使用Python 3.7和pyqt5 -不是pyside2,但是将其从pyside2更改为pyqt5很简单),并且该程序似乎可以正常工作,也许是由于基本布局或它的工作原理,因为我不确定使用pyqt5,但是这里是重新编写的代码(请注意pyqt5可以很容易地pip安装,并且比pyside2更好,因为它是最新版本,但您可以选择这样做)

from sys import exit as sysExit

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTreeWidget, QTreeWidgetItem

class MainWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self)

        userSelection = [['object1', 'object2', 'object3'], ['object1', 'object2', 'object3'], ['object1', 'object2', 'object3']]

        treeWidget = QTreeWidget()
        treeWidgetsList=[]

        for selection in userSelection:
            list_=[]

            for obj in selection:
                if not treeWidgetsList:
                    treeWidgetItem = QTreeWidgetItem(treeWidget, [obj])
                    treeWidgetItem.setFlags(treeWidgetItem.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) 

                else:
                    for t in treeWidgetsList[-1]:
                        treeWidgetItem = QTreeWidgetItem(t, [obj])
                        treeWidgetItem.setFlags(treeWidgetItem.flags() | Qt.ItemIsUserCheckable)
                        treeWidgetItem.setCheckState(0, Qt.Unchecked)

                list_.append(treeWidgetItem)

            treeWidgetsList.append(list_)

        layout = QVBoxLayout(self)
        layout.addWidget(treeWidget)
        self.setLayout(layout)

if __name__ == "__main__":
    MainThred = QApplication([])

    MainGUI = MainWidget()
    MainGUI.show()

    sysExit(MainThred.exec_())

答案 1 :(得分:0)

对于碰巧正在寻找类似问题的解决方案的所有人,这里是一个有效的示例。每个用户选择(以列表的形式)都作为先前添加的对象的子级添加到树小部件。

treeWidgetsList=[[treeWidget]]
#for selection in userSelection:
    list_=[]
    for obj in selection:
        for t in treeWidgetsList[-1]:
            treeWidgetItem = QtWidgets.QTreeWidgetItem(t, [obj])
            treeWidgetItem.setFlags(treeWidgetItem.flags() | QtCore.Qt.ItemIsTristate | QtCore.Qt.ItemIsUserCheckable)
            treeWidgetItem.setCheckState(0, QtCore.Qt.Checked)
            list_.append(treeWidgetItem)

    treeWidgetsList.append(list_)