我有一个QTreeWidget,它有一个隐藏的根,2个孩子作为标题,2个孩子在这些孩子下面。
ROOT (HIDDEN)
|
|- HEADER 1 (CHILD, NOT CHECKABLE)
| |
| |- ITEM 11 (CHILD, CHECKABLE)
| |- ITEM 12 (CHILD, CHECKABLE)
|
|- HEADER 2 (CHILD)
| |
| | - ITEM 21 (CHILD, CHECKABLE)
| | - ITEM 22 (CHILD, CHECKABLE)
使用item = {}
词典中的变量,我需要{HEIDER 1,ITEM 12的setCheckState
。目前我使用self.CurrentIndexLabel
跟踪当前选定的标签,尽管这可能与此无关例。我已经填充了这样的树:
TreeList = ({
'Header1': (('Item11', 'Item12', )),
'Header2': (('Item21', 'Item22', )),
})
item = {'Item12': {'ItemEnabled': 1}} # 0 = No, 1 = Yes
for key, value in TreeList.items():
parent = QTreeWidgetItem(self.ListTreeView, [key])
for val in value:
child = QTreeWidgetItem([val])
child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
child.setCheckState(0, Qt.Unchecked)
parent.addChild(child)
最初,我需要根据为每个项目添加变量的item = {}
字典来设置项目是否已选中或取消选中,当用户取消选中该项目时,我需要更改{{1} }字典来反映项目是否已启用。
我假设我需要使用信号和插槽来检测更改,但我似乎无法弄清楚如何将列表中的项目标记为已选中,并且我不确定如何反映用户检查或取消选中item = {}
中的项目。
如果我可以使用1和0跟踪检查或取消选中以使用当前状态更新字典TreeList
,那将是理想的。
实现这一目标的最佳方法是什么?我是python的新手,所以请耐心等待。我正在使用Python 3.6和PyQt5
答案 0 :(得分:0)
选中或取消选中QTreeWidgetItem
时,会发出QTreeWidget.itemChanged(item, column)
信号。因此,您可以使用它,然后更新插槽中的item
dict。
正如评论中所说,我认为你使用的item
字典的结构是不恰当的。使用QTreeWidgetItem
文本值作为键(或者更好的是,QTreeWidgetItem
对象本身)会更容易,所以像item = {'Item12': {'ItemEnabled': True}}
例如:
from PyQt4 import QtCore, QtGui
import sys
class MyApplication(QtGui.QMainWindow):
def __init__(self):
super(MyApplication, self).__init__()
self.item = {'Item12': {'ItemEnabled': True}}
self.setupUi()
TreeList = ({
'Header1': ('Item11', 'Item12',),
'Header2': ('Item21', 'Item22',),
})
for key, value in TreeList.items():
parent = QtGui.QTreeWidgetItem(self.treeWidget, [key])
for val in value:
child = QtGui.QTreeWidgetItem([val])
child.setFlags(child.flags() | QtCore.Qt.ItemIsUserCheckable)
child.setCheckState(0, QtCore.Qt.Checked if val in self.item else QtCore.Qt.Unchecked)
parent.addChild(child)
self.treeWidget.itemChanged.connect(self.treeWidgetItemChanged)
def setupUi(self):
self.centralwidget = QtGui.QWidget(self)
self.gridLayout = QtGui.QGridLayout(self.centralwidget)
self.treeWidget = QtGui.QTreeWidget(self.centralwidget)
self.gridLayout.addWidget(self.treeWidget)
self.setCentralWidget(self.centralwidget)
def treeWidgetItemChanged(self, widgetItem, column):
print("Item {} is checked: {}".format(widgetItem, widgetItem.checkState(column) == QtCore.Qt.Checked))
itemName = str(widgetItem.text(column))
try:
self.item[itemName]['ItemEnabled'] = widgetItem.checkState(column) == QtCore.Qt.Checked
except KeyError:
self.item[itemName] = {'ItemEnabled': widgetItem.checkState(column) == QtCore.Qt.Checked}
print(self.item)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
w = MyApplication()
w.show()
sys.exit(app.exec_())