首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Maya内显示QTreeWidget分支线(PyQt5)?

在Maya内显示QTreeWidget分支线(PyQt5)?
EN

Stack Overflow用户
提问于 2018-04-26 15:27:37
回答 2查看 1.5K关注 0票数 0

首先,我在Maya中使用PySide2,这与PyQt5几乎是一样的。

我正在用一个非常简单的QTreeWidget创建一个ui。我想Maya的默认样式选择不会显示连接所有树项的分支线,因此我一直试图将它们添加回(但没有成功)。

下面是一些显示我尝试过的相关代码:

代码语言:javascript
复制
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::branch部分抓取了所有的QTreeView样式表项目:http://doc.qt.io/qt-5/stylesheet-examples.html,由于我的树总是被完全展开,所以我可能不需要closed项或箭头,但是在尝试修改它之前,我只想先得到缺省值.

总之,没有线(或箭头)被显示.在我将分支项添加到样式表字符串之后,Maya默认样式中的箭头也消失了(这很好,因为我不想要它们)。我知道,至少有一部分样式表是有效的,因为转换颜色线是正确工作的。

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-27 03:43:57

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-04-26 18:20:00

试一试:

代码语言:javascript
复制
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_())  

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50046824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档