Изменить цвет текста QStandardItem в модели/представлении?

Как изменить цвет текста QStandardItem при использовании в конфигурации модели/представления. Кажется, что он всегда будет отображаться как черный тест.

Ниже приведен исполняемый пример кода, в котором «Hello World» отображается черным текстом. Я пытаюсь изменить его на зеленый текст.

Я также пытался использовать _component.setForeground(QColor(0,255,0)).

import sys
import string
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class ComponentItem(QStandardItem):
    """docstring for ComponentItem"""
    def __init__(self, text, role=Qt.DisplayRole):
        super(ComponentItem, self).__init__()
        self.component = text
        self.role = role

    def data(self, role=Qt.DisplayRole):
        if role != self.role:
            return QVariant()
        if role == Qt.DisplayRole:
            return QVariant(self.component)
        if role == Qt.ForegroundRole:
            return QColor(0,255,0)
        return QVariant()

class ComponentModel(QStandardItemModel):
    """docstring for ComponentModel"""
    def __init__(self, parent=None):
        super(ComponentModel, self).__init__()
        self.parent = parent

        _component = ComponentItem("Hello World")  #How do I change Text Color?
        _component.setData(QColor(255,0,0), Qt.ForegroundRole) #Does not work

        self.appendRow([_component])

class ComponentTree(QTreeView):
    """docstring for ComponentTree"""
    def __init__(self, parent=None):
        super(ComponentTree, self).__init__()
        self.parent = parent

        self.setModel(ComponentModel(self))

class Example(QWidget):
    def __init__(self):
        super(Example, self).__init__()

        _tree = ComponentTree()

        vBox = QVBoxLayout()
        vBox.addWidget(_tree)

        self.setLayout(vBox)
        self.show()

def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

person Dennis Miller    schedule 25.07.2018    source источник


Ответы (1)


Проблема вызвана следующими строками:

if role != self.role:
    return QVariant()
...

поскольку, если role равно Qt.ForegroundRole, а self.role равно Qt.DisplayRole, то возвращается QVariant(), и предложение, которое вы хотите, не будет выполнено.

Я не понимаю причину сохранения текста и роли. Я не вижу необходимости перезаписывать data().

Таким образом, решение будет следующим:

class ComponentItem(QStandardItem):
    def __init__(self, text, role=Qt.DisplayRole):
        super(ComponentItem, self).__init__()
        self.setData(text, role)

введите здесь описание изображения


Также еще одна тихая ошибка, когда я тестировал ваш код, был выпущен со следующим предупреждением:

QObject::startTimer: QTimer can only be used with threads started with QThread
QObject::startTimer: QTimer can only be used with threads started with QThread

Это предупреждение вызвано тем, что вы не передали родителя модели и, следовательно, память не была удалена правильно, решение заключается в следующем:

class ComponentModel(QStandardItemModel):
    def __init__(self, parent=None):
        super(ComponentModel, self).__init__(parent)

        _component = ComponentItem("Hello World")  #How do I change Text Color?
        _component.setData(QColor(255,0,0), Qt.ForegroundRole) #Does not work
        self.appendRow([_component])
person eyllanesc    schedule 25.07.2018