在Maya(PyQt5)中显示QTreeWidget分支行?

时间:2018-04-26 15:27:37

标签: python pyqt pyqt5 maya

首先,我在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,由于我的树将永远完全展开,我可能不需要{{1项目或箭头,但我试图在尝试修改它之前先获取默认值...

无论如何,没有显示任何行(或箭头)...在我将分支项添加到样式表字符串后,Maya的默认样式中的箭头也消失了(这很好,因为我无论如何都不想要它们。我知道至少部分样式表正在工作,因为atlernating颜色线确实可以正常工作。

所以我想真正的问题是如何让这些图像显示出来?我认为它们可能以某种方式固有地存储在PySide2 / PyQt5库中,但我猜不是因为没有显示......我如何明确告诉样式表存储图像的位置以便可以使用它们?

谢谢!

2 个答案:

答案 0 :(得分:0)

试一试:

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_())  

enter image description here

答案 1 :(得分:0)

事实证明,答案比我怀疑的更容易....我遇到的问题与windows目录如何用\而不是/ ugh ......分开有关。 / p>

您可以非常轻松地将相对或整个路径放到样式表字符串中的图像文件中,它将找到并使用该文件,除非您使用Windows路径(即使您从反斜杠中退出)。

因此url(C:\path\to\image.png)url(C:\\path\\to\\image.png)不起作用。

但是url(C:/path/to/image.png)实际上确实有效 - 幸运的是找到了文件,即使目录分隔符对于Windows不正确......

我最后在第一篇文章中保存并修改了样式表示例网站中的分支图像。一旦我将它们保存在我正在编写我的ui工具的文件附近的位置,我就会生成各自的文件路径并用正斜杠替换反斜杠 - 这看起来像这样:VLINE = os.path.join(path, 'vline.png').replace('\\', '/')。然后我使用字符串格式将它们插入到我的样式表字符串中并且它有效。