QTreeWidget选择第一项

2024-04-18 17:36:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从XML文件生成QTreeWidget。XML如下所示,我想创建一个名称树:

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

目前,我使用以下代码来实现这一点(稍微简化的代码)

^{pr2}$

关于这个我有两个问题:

  1. 主要问题:是否有方法选择树中的第一个项,在本例中是foo。我试着用setCurrentItem()setCurrentIndex()做一些事情,但没能让它工作。我在google上搜索了一点,但是我找到的所有解决方案都适用于模型。在
  2. (可选)这个递归函数是一种很好的方法,还是有更好的方法?在

Tags: 文件方法代码name名称foobarroot
1条回答
网友
1楼 · 发布于 2024-04-18 17:36:23

递归是很好的,可以保持这种方式,在回答您的主要问题时,只需:

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

编辑

要以递归方式构建而不影响树,可以执行以下操作:

^{pr2}$

编辑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()

相关问题 更多 >