0
모든 트리 항목의 선택 상태를 가져 와서 self._data에 다시 저장하려면 어떻게해야합니까?QTreeView에서 모든 트리 항목의 선택 상태를 가져 오는 방법은 무엇입니까?
내가 나무
{
"camera": {
"ver": 8,
"new_ver": 10
},
"char": {
"bob": {
"ver": 2,
"new_ver": 20
},
"aston": {
"ver": 4,
"new_ver": 13
}
}
}
을 채우기 위해이 데이터 구조를 사용하여 코드는 푸시 버튼을 클릭 할 때 예상되는 결과는
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import uic
import os
# enable ctrl-c to kill the app
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
import json
from pprint import pprint
from collections import OrderedDict
data_dict = OrderedDict([('camera', OrderedDict([('ver', '8'), ('new_ver', '10')])),
('char',
OrderedDict([
('bob', OrderedDict(
[('ver', '2'), ('new_ver', '20')])),
('aston', OrderedDict(
[('ver', '4'), ('new_ver', '13')]))
]))
])
pprint(data_dict)
class AssetModel(QStandardItemModel):
def __init__(self):
super(AssetModel, self).__init__()
self._data = data_dict
# def data(self, index, role=Qt.DisplayRole):
# if index.isValid():
# if role == Qt.DisplayRole:
# def setData(self, index, value, role=Qt.EditRole):
# print 'in setData'
# if index.isValid():
# print 'index:',index.row(),'value:',value.toPyObject(),role
# if index.row()==0 and role==Qt.CheckStateRole:
# # self.dataChanged.emit(index, index)
# print 'need to update self._data'
# return True
# return False
class MyWindow(QDialog):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
layout = QVBoxLayout()
self.treeView = QTreeView()
self.model = AssetModel()
self.treeView.setModel(self.model)
self.button = QPushButton('Print')
layout.addWidget(self.treeView)
layout.addWidget(self.button)
self.setLayout(layout)
self.initialLoad()
self.button.clicked.connect(self.get_data)
def initialLoad(self):
# self.model.load()
self.resize(400, 300)
self.populateTree()
def populateTree(self):
for k in data_dict.keys():
parent1 = QStandardItem(k)
parent1.setCheckable(True)
if k == 'char':
for j in data_dict[k].keys():
char_name = QStandardItem(j)
char_name.setCheckable(True)
ver_data = data_dict[k][j].values()
children = [QStandardItem(x)
for x in ver_data]
if int(ver_data[0]) < int(ver_data[1]):
char_name.setCheckState(Qt.Checked)
parent1.setCheckState(Qt.Checked)
parent1.appendRow([char_name] + children)
self.model.appendRow(parent1)
else:
ver_data = data_dict[k].values()
children = [QStandardItem(x) for x in ver_data]
self.model.appendRow([parent1]+children)
if int(ver_data[0]) < int(ver_data[1]):
parent1.setCheckState(Qt.Checked)
self.headers = ['asset', 'ver', 'new_ver']
self.model.setHorizontalHeaderLabels(self.headers)
self.treeView.expandAll()
for i in range(len(self.headers)):
self.treeView.resizeColumnToContents(i)
def get_data(self):
# print the data shown on tree
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
이며,이 구조를 출력 : 가정 카메라를 밥이 체크되면, aston은 체크되지 않는다.
{
"camera": {
"ver": 8,
"new_ver": 10,
"checked":1
},
"char": {
"bob": {
"ver": 2,
"new_ver": 20,
"checked":1
},
"aston": {
"ver": 4,
"new_ver": 13,
"checked":0
}
}
}
나는 단지 treeview 결과를 얻을?
구조체를 저장하면 그 구조체를 채우는 것과 같은 논리가 있습니다. 값은 나무를 쓰는 것이 아니라 나무에서 딕트로 바뀝니다. – ekhumoro