【问题标题】:Display QTreeWidget branch lines within Maya (PyQt5)?在 Maya (PyQt5) 中显示 QTreeWidget 分支线?
【发布时间】:2018-10-07 09:06:50
【问题描述】:

首先,我在 Maya 中使用 PySide2,它与 PyQt5 几乎相同。

我正在用一个非常简单的 QTreeWidget 创建一个用户界面。我猜 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 默认样式中的箭头也消失了(这很好,因为我不想要反正他们)。我知道至少有一部分样式表可以正常工作,因为交替的颜色线可以正常工作。

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

谢谢!

【问题讨论】:

    标签: python pyqt pyqt5 maya


    【解决方案1】:

    试试看:

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

    【讨论】:

    • 对不起...我想我真的不明白这是如何回答我的问题...这些图像在哪里以及您的代码如何找到它们?你能解释一下吗? (我还用我正在使用的导入行更新了我的问题......我正在从 PySide2 导入)
    • 没关系...我想通了-如果您好奇,请查看我的答案...但是,感谢您抽出宝贵的时间来回答!
    【解决方案2】:

    事实证明,答案比我想象的要容易......我遇到的问题与 windows 目录如何用\ 分隔,而不是/ 呃...

    您可以很容易地在样式表字符串中放置图像文件的相对路径或完整路径,除非您使用 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('\\', '/')。然后我使用字符串格式将它们插入到我的样式表字符串中并且它起作用了。

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2017-12-20
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多