2012-08-16 5 views
4

QTreeWidget을 XML 파일로 만듭니다. XML은 다음과 같다 나는 이름의 나무 만들고 싶어 : 나는 그렇게 (다소 단순화 된 코드)를 수행하려면 다음 코드를 사용하고QTreeWidget 첫 번째 항목을 선택하십시오.

<root> 
    <f name='foo'>bar 
     <f name='foo2'>baz</f> 
    </f> 
</root> 

순간을 :

import lxml.etree as et 

#... 

self.xml = et.XML(filters.filtersxml) 
self.tree_widget = QTreeWidget(parent) 

def add_items(parent, xmlroot): 
    for i in xmlroot.getchildren(): 
     item = QTreeWidgetItem(parent, [i.get('name')]) 
     if len(i.getchildren()) != 0: 
      add_items(item, i) 

add_items(self.tree_widget, self.xml) 

사실 이것에 대해 두 가지 질문이 있습니다

  1. 홈페이지 질문 : 트리의 첫 번째 항목을 선택하는 몇 가지 방법으로, foo는 있는가 이 경우. setCurrentItem()setCurrentIndex()을 사용하여 작업을 시도했지만 작동하지 못했습니다. 제가 그것에 대해 조금 봤지만, 찾은 모든 솔루션은 모델에서 작동합니다.
  2. (선택 사항)이 재귀 함수가 좋은 방법인가, 아니면 더 좋은 방법이 있습니까? 항목이 이미 트리시에 추가 된 것을

    # after all your code 
    add_items(self.tree_widget, self.xml) 
    
    # select the root item 
    self.tree_widget.setCurrentItem(self.tree_widget.topLevelItem(0)) 
    

    당신은 단지 확인해야 :

답변

9

재귀는 어떻게 그런 식으로 유지하고, 당신의 주요 질문에 대답 것, 좋은 setCurrentItem을 호출합니다. 그렇지 않으면 실제로 작동하지 않습니다.

import lxml.etree as et 

#... 

self.xml = et.XML(filters.filtersxml) 
self.tree_widget = QTreeWidget(parent) 

def add_items(parent, xmlroot): 
    output = [] 
    for i in xmlroot.getchildren(): 
     item = QTreeWidgetItem(parent, [i.get('name')]) 
     output.append(item) 
     if len(i.getchildren()) != 0: 
      add_items(item, i) 
    return output 

items = add_items(None, self.xml) 
self.tree_widget.addTopLevelItems(items) 
self.tree_widget.setCurrentItem(items[0]) 

: 일부 방법은

트리에 영향을주지 않고 반복적으로 구축하려면, 당신이 할 수있는 이미 (setExpanded와하는 setSelected 등) 나무

편집에 관련되는 항목이 필요 편집 2 : 한 번에 모두로드 중

그리고 조금 더 토끼의 구멍을 내려 가면서, 내가 개인적으로 unne을 최소화하기 위해 할 방법 가능한 한 많은 cessary 통화 및 목록은 아이들이 한 번만 루프를 구축하는 것입니다 :

import lxml.etree as et 

#... 

self.xml = et.XML(filters.filtersxml) 
self.tree_widget = QTreeWidget(parent) 

def create_item(parent, xmlroot): 
    item = QTreeWidgetItem(parent, [xmlroot.get('name')]) 
    for xmlchild in xmlroot.getchildren(): 
     create_item(item, xmlchild) 
    return item 

items = [create_item(None, xmlchild) for xmlchild in self.xml.getchildren()] 
self.tree_widget.addTopLevelItems(items) 
if (items): 
    self.tree_widget.setCurrentItem(items[0]) 

편집 3 : 동적

로드 그리고이 제기 된 이후 ... 방법 동적으로 아이들을로드 할 때 각 레벨을 저장하고 확장 한 후에로드 할 수 있습니다.

+0

일반적으로 트리 외부의 항목을 빌드 한 다음 단일 루트 항목) 또는 최상위 수준의 목록 items와 do : insertTopLevelItem' 또는'insertTopLevelItems' – jdi

+0

네, 일반적으로 그렇게하는 방식입니다. 어떤 것이 더 좋고 빠르지는 확실하지 않으므로, 둘 다 실행 가능하다고 말할 것입니다. blockSignals (True/False) 및 setUpdatesEnabled (False/True) 호출 내에서 이와 같은 트리 위젯에 대한 수정 사항을 샌드위치하는 것이 좋습니다. –

+0

글쎄, 먼저 아이템 구조를 구축하고 마침내 트리를 한 번 호출하면된다고 생각하면 걱정할 필요가 없을 것입니다. 그러나 루프에서 항목을 임의로 추가 및 제거 할 때 좋은 점은 – jdi

관련 문제