在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
相关产品推荐
相关产品推荐

