>

나는 QTreeWidget 를 만들고있다  XML 파일에서. XML은 아래와 같으며 이름의 트리를 만들고 싶습니다.

<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)

실제로 이것에 대해 두 가지 질문이 있습니다 :

<올>
  • 주요 질문 :트리에서 첫 번째 항목을 선택하는 방법이 있습니까 (이 경우 foo)? 나는 setCurrentItem() 로 무언가를하려고했습니다.  그리고 setCurrentIndex() , 그러나 작동시키지 못했습니다. 나는 그것에 대해 조금 구글 검색했지만 내가 찾은 모든 솔루션은 모델과 함께 작동합니다.
  • (선택 사항)이 재귀 함수가이를 수행하기위한 좋은 접근 방법입니까, 아니면 더 좋은 방법이 있습니까?

    • 답변 # 1

      재귀는 좋고, 그렇게 유지하고, 주요 질문에 대한 답은 다음과 같습니다.

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

      setCurrentItem을 호출 할 때 항목이 트리에 이미 추가되어 있는지 확인해야합니다. 그렇지 않으면 실제로 작동하지 않습니다. 일부 메소드는 항목이 이미 트리에 연결되어 있어야합니다 (예 : setExpanded 및 setSelected)

      수정

      나무에 영향을주지 않고 재귀 적으로 구축하려면 다음을 수행하십시오.

      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])
      
      

      편집 2 : 한 번에 모두로드

      토끼 구멍을 조금 더 아래로 가려면 불필요한 호출과 목록을 최소화하기 위해 개인적 으로이 작업을 수행하는 방식으로 자녀를 한 번만 루프로 만드는 것입니다.

      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 : 동적으로로드

      자라서 아이를 동적으로로드하는 방법은 각 레벨을 저장하고 확장 한 후에로드하는 것입니다.

      import lxml.etree as et
      from PyQt4.QtGui import QTreeWidgetItem
      # ...    
      class XmlTreeWidgetItem(QTreeWidgetItem):
          def __init__( self, parent, xmlitem ):
              super(MyTreeWidgetItem, self).__init__(parent)
              self.setText(0, xmlitem.get('name'))
              self.setChildIndicatorPolicy(self.ShowIndicator)
              self._xmlitem = xmlitem
              self._loaded = False
          def loadChildren( self ):
              if ( self._loaded ):
                  return
              self._loaded = True
              self.setChildIndicatorPolicy(self.DontShowIndicatorWhenChildless)
              for xmlchild in self._xmlitem.getchildren():
                  XmlTreeWidgetItem(self, xmlchild)
      # ...
      class SomeClass(QWidget):
          def __init__( self, parent = None ):
              super(SomeClass, self).__init__(parent)
              self.tree_widget = QTreeWidget(parent)
              xml = et.XML(filters.filtersxml)
              items = [XmlTreeWidgetItem(None, xchild) for xchild in xml.getchildren()]
              self.tree_widget.addTopLevelItems(items)
              if ( items ):
                  self.tree_widget.setCurrentItem(items[0])
              # create connections
              self.tree_widget.itemExpanded.connect(self.loadItem)
          def loadItem( self, item ):
              item.loadChildren()
      
      

    관련 자료

  • 이전 Java에 대한 Kotlin 정적 변수 및 함수를 어떻게 만드나요?
  • 다음 javascript - 전체 화면 변경을 위해 (@host) listener 추가