Показать ветки QTreeWidget в Maya (PyQt5)? - PullRequest
0 голосов
/ 26 апреля 2018

Для начала я использую PySide2 в Maya, которая почти такая же, как 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::branch из раздела QTreeView на этом сайте: http://doc.qt.io/qt-5/stylesheet-examples.html и, поскольку мое дерево всегда будет полностью раскрыто, мне, вероятно, не нужны элементы closed или стрелки, но я пытался просто получить значения по умолчанию, прежде чем пытаться изменить его ...

В любом случае, строки (или стрелки) не отображаются ... После того, как я добавил элементы ветви в строку таблицы стилей, стрелки, которые были там из стиля по умолчанию Maya, также исчезли (что хорошо, потому что я не хотел их в любом случае). Я знаю, что, по крайней мере, часть таблицы стилей работает, так как вспомогательные цветные линии работают правильно.

Так что, я думаю, реальный вопрос в том, как мне заставить эти изображения показываться? Я думал, что они могут каким-то образом храниться в библиотеках PySide2 / PyQt5, но я предполагаю, что нет, поскольку ничего не показывается ... Как я могу явно указать таблице стилей, где хранятся изображения, чтобы их можно было использовать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Как оказалось, ответ проще, чем я подозревал .... У меня возникла проблема, связанная с тем, как каталоги Windows разделены \ вместо / тьфу ...

Вы можете очень легко указать относительный или полный путь к файлу изображения в строке таблицы стилей, и он найдет и будет использовать файл, ЕСЛИ НЕ вы используете путь к Windows (даже если вы удалите обратную косую черту).

То есть url(C:\path\to\image.png) и url(C:\\path\\to\\image.png) не работают.

Но url(C:/path/to/image.png) на самом деле работает - и, к счастью, находит файл, даже если разделители каталогов неверны для Windows ...

В моем первом посте я сохранил и изменил изображения веток с сайта примеров стилей. После того как я сохранил их в месте рядом с файлом, в который я пишу свой инструмент пользовательского интерфейса, я сгенерировал их соответствующие пути к файлам и заменил обратные косые черты на прямые косые черты - что бы выглядело примерно так: VLINE = os.path.join(path, 'vline.png').replace('\\', '/'). Затем я использовал форматирование строки, чтобы вставить их в строку таблицы стилей, и это сработало.

0 голосов
/ 26 апреля 2018

Попробуйте:

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

...