在 Maya (PyQt5) 中显示 QTreeWidget 分支线?
Display QTreeWidget branch lines within Maya (PyQt5)?
首先,我在 Maya 中使用 PySide2,它与 PyQt5 几乎相同。
我正在用一个非常简单的 QTreeWidget 创建 ui。我想 Maya 的默认样式选择不会显示连接所有树项目的分支线,我想要它们,所以我一直在尝试将它们添加回去(但没有成功)。
下面是一些相关代码,展示了我的尝试:
import PySide2.QtCore as QtCore
import PySide2.QtGui as QtGui
import PySide2.QtWidgets as QtWidgets
# I'm defining the stylesheet string outside of my function (which is why it's all caps)
#
STYLESHEET = '''QTreeWidget {border:none;}
QTreeWidget::item {height: 20px;}
QTreeView {
alternate-background-color: rgba(35,35,35,255);
background: rgba(45,45,45,255);}
QTreeView::branch:has-siblings:!adjoins-item {
border-image: url(vline.png) 0;}
QTreeView::branch:has-siblings:adjoins-item {
border-image: url(branch-more.png) 0;}
QTreeView::branch:!has-children:!has-siblings:adjoins-item {
border-image: url(branch-end.png) 0;}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(branch-closed.png);}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(branch-open.png);}'''
# and an excerpt from where I'm creating my QTreeWidget (inside a function)
#
tree_widget = QtWidgets.QTreeWidget()
tree_widget.setFocusPolicy(QtCore.Qt.NoFocus)
tree_widget.setAlternatingRowColors(True)
tree_widget.setStyleSheet(STYLESHEET)
tree_widget.setUniformRowHeights(True)
tree_widget.setItemsExpandable(False)
tree_widget.setHeaderHidden(True)
我还有一个递归函数,它通过嵌套字典将 QTreeWidgetItems
添加到树形小部件,如果您需要,我可以显示...添加项目后,我使用 tree_widget.expandAll()
打开它们。
我从该站点的 QTreeView 部分获取了所有 QTreeView::branch
样式表项目:http://doc.qt.io/qt-5/stylesheet-examples.html 因为我的树将始终完全展开,所以我可能不需要 closed
项目或箭头,但我试图在尝试修改它之前先获取默认值...
无论如何,没有显示线条(或箭头)...在我将分支项添加到样式表字符串后,Maya 默认样式中的箭头也消失了(这很好,因为我没有无论如何都不想要它们)。我知道至少有一部分样式表在工作,因为 atlernating 颜色线确实工作正常。
所以我想真正的问题是如何显示这些图像?我认为它们可能以某种方式固有地存储在 PySide2/PyQt5 库中,但我猜不是,因为没有显示任何内容......我如何明确告诉样式表图像存储在哪里以便可以使用它们?
谢谢!
试一试:
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import Qt
class App(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
# I'm defining the stylesheet string outside of my function (which is why it's all caps)
#
STYLESHEET = '''QTreeWidget {border:none;}
QTreeWidget::item {height: 20px;
color: rgba(255,255,255,255);} /* +++ */
QTreeView {
alternate-background-color: rgba(35,35,35,255);
background: rgba(45,45,45,255);}
QTreeView::branch:has-siblings:!adjoins-item {
border-image: url(vline.png) 0;}
QTreeView::branch:has-siblings:adjoins-item {
border-image: url(branch-more.png) 0;}
QTreeView::branch:!has-children:!has-siblings:adjoins-item {
border-image: url(branch-end.png) 0;}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(branch-closed.png);}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(branch-open.png);}'''
TreeList = ({
'Header1': (('Item1', 'Item2', 'Item3', )),
'Header2': (('Item11', 'Item21', 'Item31', 'Item41',)),
})
# and an excerpt from where I'm creating my QTreeWidget (inside a function)
#
self.tree_widget = QtWidgets.QTreeWidget()
self.tree_widget.setFocusPolicy(QtCore.Qt.NoFocus)
self.tree_widget.setAlternatingRowColors(True)
self.tree_widget.setStyleSheet(STYLESHEET)
self.tree_widget.setUniformRowHeights(True)
#self.tree_widget.setItemsExpandable(False) # ---
self.tree_widget.setHeaderHidden(True)
for key, value in TreeList.items():
parent = QtWidgets.QTreeWidgetItem(self.tree_widget, [key])
for val in value:
child = QtWidgets.QTreeWidgetItem([val])
child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
child.setCheckState(0, Qt.Unchecked)
parent.addChild(child)
items = self.tree_widget.findItems("Item2", Qt.MatchFixedString| Qt.MatchRecursive)
[it.setSelected(True) for it in items]
self.tree_widget.expandAll()
self.tree_widget.show()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
myapp = App()
#myapp.show()
sys.exit(app.exec_())
事实证明,答案比我想象的要简单....我遇到的问题与 windows 目录如何用 \
而不是 [=11= 分隔有关]呃...
您可以非常轻松地将图像文件的相对路径或完整路径放入样式表字符串中,除非您使用 windows 路径(即使您转义了反斜杠),否则它将定位并使用该文件.
因此 url(C:\path\to\image.png)
和 url(C:\path\to\image.png)
不起作用。
但是 url(C:/path/to/image.png)
实际上确实有效 - 幸运的是找到了文件,即使 windows...
的目录分隔符不正确
在我的第一个 post 中,我最终保存并修改了来自样式表示例网站的分支图像。一旦我将它们保存在我正在编写 ui 工具的文件附近的位置,然后我生成了它们各自的文件路径并将反斜杠替换为正斜杠 - 看起来像这样:VLINE = os.path.join(path, 'vline.png').replace('\', '/')
.然后我使用字符串格式将它们插入到我的样式表字符串中并且成功了。
首先,我在 Maya 中使用 PySide2,它与 PyQt5 几乎相同。
我正在用一个非常简单的 QTreeWidget 创建 ui。我想 Maya 的默认样式选择不会显示连接所有树项目的分支线,我想要它们,所以我一直在尝试将它们添加回去(但没有成功)。
下面是一些相关代码,展示了我的尝试:
import PySide2.QtCore as QtCore
import PySide2.QtGui as QtGui
import PySide2.QtWidgets as QtWidgets
# I'm defining the stylesheet string outside of my function (which is why it's all caps)
#
STYLESHEET = '''QTreeWidget {border:none;}
QTreeWidget::item {height: 20px;}
QTreeView {
alternate-background-color: rgba(35,35,35,255);
background: rgba(45,45,45,255);}
QTreeView::branch:has-siblings:!adjoins-item {
border-image: url(vline.png) 0;}
QTreeView::branch:has-siblings:adjoins-item {
border-image: url(branch-more.png) 0;}
QTreeView::branch:!has-children:!has-siblings:adjoins-item {
border-image: url(branch-end.png) 0;}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(branch-closed.png);}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(branch-open.png);}'''
# and an excerpt from where I'm creating my QTreeWidget (inside a function)
#
tree_widget = QtWidgets.QTreeWidget()
tree_widget.setFocusPolicy(QtCore.Qt.NoFocus)
tree_widget.setAlternatingRowColors(True)
tree_widget.setStyleSheet(STYLESHEET)
tree_widget.setUniformRowHeights(True)
tree_widget.setItemsExpandable(False)
tree_widget.setHeaderHidden(True)
我还有一个递归函数,它通过嵌套字典将 QTreeWidgetItems
添加到树形小部件,如果您需要,我可以显示...添加项目后,我使用 tree_widget.expandAll()
打开它们。
我从该站点的 QTreeView 部分获取了所有 QTreeView::branch
样式表项目:http://doc.qt.io/qt-5/stylesheet-examples.html 因为我的树将始终完全展开,所以我可能不需要 closed
项目或箭头,但我试图在尝试修改它之前先获取默认值...
无论如何,没有显示线条(或箭头)...在我将分支项添加到样式表字符串后,Maya 默认样式中的箭头也消失了(这很好,因为我没有无论如何都不想要它们)。我知道至少有一部分样式表在工作,因为 atlernating 颜色线确实工作正常。
所以我想真正的问题是如何显示这些图像?我认为它们可能以某种方式固有地存储在 PySide2/PyQt5 库中,但我猜不是,因为没有显示任何内容......我如何明确告诉样式表图像存储在哪里以便可以使用它们?
谢谢!
试一试:
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import Qt
class App(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
# I'm defining the stylesheet string outside of my function (which is why it's all caps)
#
STYLESHEET = '''QTreeWidget {border:none;}
QTreeWidget::item {height: 20px;
color: rgba(255,255,255,255);} /* +++ */
QTreeView {
alternate-background-color: rgba(35,35,35,255);
background: rgba(45,45,45,255);}
QTreeView::branch:has-siblings:!adjoins-item {
border-image: url(vline.png) 0;}
QTreeView::branch:has-siblings:adjoins-item {
border-image: url(branch-more.png) 0;}
QTreeView::branch:!has-children:!has-siblings:adjoins-item {
border-image: url(branch-end.png) 0;}
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: url(branch-closed.png);}
QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: url(branch-open.png);}'''
TreeList = ({
'Header1': (('Item1', 'Item2', 'Item3', )),
'Header2': (('Item11', 'Item21', 'Item31', 'Item41',)),
})
# and an excerpt from where I'm creating my QTreeWidget (inside a function)
#
self.tree_widget = QtWidgets.QTreeWidget()
self.tree_widget.setFocusPolicy(QtCore.Qt.NoFocus)
self.tree_widget.setAlternatingRowColors(True)
self.tree_widget.setStyleSheet(STYLESHEET)
self.tree_widget.setUniformRowHeights(True)
#self.tree_widget.setItemsExpandable(False) # ---
self.tree_widget.setHeaderHidden(True)
for key, value in TreeList.items():
parent = QtWidgets.QTreeWidgetItem(self.tree_widget, [key])
for val in value:
child = QtWidgets.QTreeWidgetItem([val])
child.setFlags(child.flags() | Qt.ItemIsUserCheckable)
child.setCheckState(0, Qt.Unchecked)
parent.addChild(child)
items = self.tree_widget.findItems("Item2", Qt.MatchFixedString| Qt.MatchRecursive)
[it.setSelected(True) for it in items]
self.tree_widget.expandAll()
self.tree_widget.show()
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
myapp = App()
#myapp.show()
sys.exit(app.exec_())
事实证明,答案比我想象的要简单....我遇到的问题与 windows 目录如何用 \
而不是 [=11= 分隔有关]呃...
您可以非常轻松地将图像文件的相对路径或完整路径放入样式表字符串中,除非您使用 windows 路径(即使您转义了反斜杠),否则它将定位并使用该文件.
因此 url(C:\path\to\image.png)
和 url(C:\path\to\image.png)
不起作用。
但是 url(C:/path/to/image.png)
实际上确实有效 - 幸运的是找到了文件,即使 windows...
在我的第一个 post 中,我最终保存并修改了来自样式表示例网站的分支图像。一旦我将它们保存在我正在编写 ui 工具的文件附近的位置,然后我生成了它们各自的文件路径并将反斜杠替换为正斜杠 - 看起来像这样:VLINE = os.path.join(path, 'vline.png').replace('\', '/')
.然后我使用字符串格式将它们插入到我的样式表字符串中并且成功了。