我要寻找的是,每当用户选择一组对象时,这些对象将成为树层次结构中每个先前添加的对象的子对象。我在下面放了一个简单的工作示例,该示例模拟了三个单独的用户选择。仅正确添加了其中两个。当第三个选择应该与先前添加的每个对象作为父对象时,则仅将其作为最后一个对象的父对象。
示例 错误:
正确的育儿方式:
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_())
答案 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_)