2016-10-21 4 views
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 결과를 얻을?

img

+0

구조체를 저장하면 그 구조체를 채우는 것과 같은 논리가 있습니다. 값은 나무를 쓰는 것이 아니라 나무에서 딕트로 바뀝니다. – ekhumoro

답변

0

만 반복에 의해, 재귀 방법으로 그것을 구현합니다. 보기가 아닌 모달에서 직접 작업하십시오.

관련 문제