QTreeWidget中的setSelected

0 投票
1 回答
3241 浏览
提问于 2025-04-17 02:18

我有一个项目,需要在代码中更改树形控件的选中项。这项操作必须在我清空树形控件并重新填充数据之后进行。

我试着在添加项的时候把合适的项目标记为“选中”。这样对根节点是有效的,但对子节点就不行。我需要把QTreeWidgetItem存储在另一个变量中,然后在树形控件完全填充后再标记为选中。为什么会这样呢?

这个方法不行:

def refreshTree(self):
    treeObj.clear()
    for item in items:
        temp = QTreeWidgetItem(0)
        for key, val in item.subitems().items():
            childTemp = QTreeWidgetItem(0)
            ...setup text, font, etc...

            if(condition1):
                childTemp.setSelected(True)
            temp.addChild(childTemp)

        if(!condition1 and condition2):
            temp.setSelected(True)

        treeObj.addToplevelItem(temp)

这个方法可以:

def refreshTree(self):
    treeObj.clear()
    for item in items:
        temp = QTreeWidgetItem(0)
        for key, val in item.subitems().items():
            childTemp = QTreeWidgetItem(0)
            ...setup text, font, etc...

            if(condition1):
                selTemp = childTemp
            temp.addChild(childTemp)

        if(!condition1 and condition2):
            temp.setSelected(True)
        elif(selTemp):
            selTemp.setSelected(True)
        treeObj.addToplevelItem(temp)

1 个回答

2

文档里没有说明,但如果这个项目还没被添加到视图中,setSelected 就不会起作用:

inline void QTreeWidgetItem::setSelected(bool aselect)
{ if (view) view->setItemSelected(this, aselect); }

所以,你应该:

  • 在创建 QTreeWidgetItem 的时候,把 treeObj 或者 temp 传进去,这样它们一开始就能成为视图的一部分
  • 或者在调用 setSelected(或者其他像 setExpanded 这样的函数)之前,先调用 addChildaddTopLevelItem

我也不知道你第二段代码为什么能工作。

撰写回答