You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Maya中使用PySide2实现QTreeWidget分支线显示的方法求助

解决Maya中PySide2 QTreeWidget分支线不显示的问题

我之前在Maya里用PySide2开发TreeWidget时也踩过这个坑!Maya自带的Qt样式会默认隐藏部分树项的分支线,得通过自定义样式表强制开启,而且要注意样式优先级的问题,下面给你具体的解决方法:

方法一:使用Qt内置的分支线资源

Qt本身自带了一套树分支线的图标资源,Maya环境里也能直接访问到。你可以给QTreeWidget设置如下样式表,覆盖Maya的默认样式:

import PySide2.QtWidgets as QtWidgets

# 初始化你的QTreeWidget
tree_widget = QtWidgets.QTreeWidget()
tree_widget.setHeaderLabel("测试树结构")

# 添加测试节点
root = QtWidgets.QTreeWidgetItem(tree_widget, ["根节点"])
child1 = QtWidgets.QTreeWidgetItem(root, ["子节点1"])
child1_1 = QtWidgets.QTreeWidgetItem(child1, ["子节点1-1"])
child2 = QtWidgets.QTreeWidgetItem(root, ["子节点2"])

# 设置样式表,强制显示所有分支线
tree_widget.setStyleSheet("""
QTreeView::branch {
    border-image: none;
    image: url(none);
}
QTreeView::branch:has-siblings:!adjoins-item {
    border-image: url(:/qt-project.org/styles/commonstyle/images/vline.png) 0;
}
QTreeView::branch:has-siblings:adjoins-item {
    border-image: url(:/qt-project.org/styles/commonstyle/images/branch-more.png) 0;
}
QTreeView::branch:!has-siblings:adjoins-item {
    border-image: url(:/qt-project.org/styles/commonstyle/images/branch-end.png) 0;
}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
    border-image: none;
    image: url(:/qt-project.org/styles/commonstyle/images/branch-closed.png);
}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
    border-image: none;
    image: url(:/qt-project.org/styles/commonstyle/images/branch-open.png);
}
""")

# 展开所有节点查看效果
tree_widget.expandAll()
tree_widget.show()

关键说明:

  • 首先重置QTreeView::branch的默认样式,把border-image和image设为none,清空Maya的隐藏设置
  • 然后针对不同状态的树分支(有兄弟节点、无兄弟节点、折叠/展开),分别指定对应的分支线图标

方法二:使用自定义图片(如果内置资源失效)

如果某些版本的Maya无法访问Qt内置的资源路径,你可以自己准备一套PNG格式的分支线图片,然后用绝对路径替换样式表中的URL:

import os
import PySide2.QtWidgets as QtWidgets

# 假设你的图片放在脚本目录的images文件夹下
script_dir = os.path.dirname(os.path.abspath(__file__))
image_dir = os.path.join(script_dir, "images")

tree_widget = QtWidgets.QTreeWidget()
# ... 添加节点逻辑 ...

tree_widget.setStyleSheet(f"""
QTreeView::branch {{
    border-image: none;
    image: url(none);
}}
QTreeView::branch:has-siblings:!adjoins-item {{
    border-image: url({image_dir}/vline.png) 0;
}}
QTreeView::branch:has-siblings:adjoins-item {{
    border-image: url({image_dir}/branch-more.png) 0;
}}
QTreeView::branch:!has-siblings:adjoins-item {{
    border-image: url({image_dir}/branch-end.png) 0;
}}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {{
    border-image: none;
    image: url({image_dir}/branch-closed.png);
}}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {{
    border-image: none;
    image: url({image_dir}/branch-open.png);
}}
""")

额外注意点:

  • 设置完样式表后,可以调用tree_widget.update()刷新界面,确保样式生效
  • 如果你的QTreeWidget已经有其他样式表设置,要把分支线的样式放在样式表的最后,保证优先级更高

内容的提问来源于stack exchange,提问作者silent_sight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:50:37