QTreeWidget пользовательский выбор и поведение при наведении цвета фона - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно не указывать цвет выделения и выбранного элемента в QTreeWidget. Но я также хочу, чтобы выбранные или выделенные элементы имели какую-то границу.

Теперь у меня есть мой QTreeWidget, подобный этому:

enter image description here

Элемент "model_1" имеет зеленый цвет фона, такой как "model_2". Когда я выбираю или просто парю, он становится синим, и я не вижу исходного цвета фона. Я хочу видеть оригинальный цвет фона (в данном примере это зеленый).

Я пытался сделать это с помощью таблицы стилей :

QTreeView::item:selected {
    border: black;
    border-radius:5px;
    background-color: rgba(0,128,255,100);
}

QTreeView::item:hover {
    border: black;
    border-radius:1px;
    background-color: rgba(0,128,255,95);

}

QTreeView::item:hover:selected {
    border: black;
    border-radius:1px;
    background-color: rgba(0,128,255,70);

}

Я пытался установить background-color: inherit;, но он не работает ...

Как я увидел здесь :

Примечание. Разрешенные цвета RGB такие же, как и в CSS 2.1, как указано здесь .

некоторые ключевые слова, такие как «наследовать», не поддерживаются ..

Мне нужно сделать это в Linux и Windows.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 11 июля 2018

Я решил это.

  1. Добавление таблицы стилей в ваше приложение для активации выделения и зависания
self.setStyleSheet("""
    QTreeView::item:selected {
    }

    QTreeView::item:hover {
    }

    QTreeView::item:hover:selected {
    }
""")
  1. Создать следующий класс для пользовательского стиля делегата для элементов.
class MyStyledItemDelegate(QtWidgets.QStyledItemDelegate):
        '''
            For overriding behavior of selection and hovering in QTreeView and QTreeWidget

            When you set background color (QtGui.QColor()) to QTreeWidgetItem you also must set this color like: 
                item.setData(0, QtCore.Qt.BackgroundRole, QtGui.QColor())
        '''
        def paint(self, painter, option, index):
            def draw_my(option, painter, brush, text, icon):
                if brush is None:
                    brush = QtGui.QColor(255, 255, 255, 0) # This is original background color. I just set alpha to 0 which means it is transparent

                x, y = (option.rect.x(), option.rect.y())
                h = option.rect.height()
                painter.save()

                painter.setFont(option.font)
                if icon:
                    icon = icon.pixmap(h, h)
                    painter.drawPixmap(QtCore.QRect(x, y, h, h), icon)
                    painter.drawText(option.rect.adjusted(h, 0, 0, 0), QtCore.Qt.AlignLeft, text)
                else:
                    painter.drawText(option.rect, QtCore.Qt.AlignLeft, text)

                painter.setCompositionMode(QtGui.QPainter.CompositionMode_SourceAtop)
                painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
                painter.fillRect(option.rect, brush)
                painter.setBackgroundMode(QtCore.Qt.OpaqueMode)
                painter.setBackground(brush)
                painter.drawRect(option.rect)
                painter.restore()

            # Also should be activated in StyleSheet
            #                             Selected                                             Hovered
            if (option.state & QtWidgets.QStyle.State_Selected) or (option.state & QtWidgets.QStyle.State_MouseOver):
                option.font.setWeight(QtGui.QFont.Bold)

                brush = index.data(QtCore.Qt.BackgroundRole)
                text = index.data(QtCore.Qt.DisplayRole)
                icon = index.data(QtCore.Qt.DecorationRole)

                draw_my(option=option, painter=painter, brush=brush, text=text, icon=icon)   
            else:
                QtWidgets.QStyledItemDelegate.paint(self, painter, option, index)
  1. Установите свой пользовательский делегат на QTreeWidget объект

custom_QStyledItemDelegate = MyStyledItemDelegate () tree_widget.setItemDelegate (custom_QStyledItemDelegate)

  1. Когда вы устанавливаете цвет фона для элемента, также устанавливайте данные следующим образом

item.setBackground (0, QtGui.QBrush (QtGui.QColor (0, 255, 150, 100)))

item.setData (0, QtCore.Qt.BackgroundRole, QtGui.QColor (0, 255, 150, 100)) # Требуется рисовать выбранные и собранные данные в MyStyledItemDelegate

  1. Наслаждайтесь

enter image description here

PS: Я извиняюсь за такой плохой стиль этого ответа, я не мог понять, как установить стиль кода для моих фрагментов кода .. Это не сработало.

...