Стили pyqt на основе стилей ячеек TableView на основе содержимого - PullRequest
0 голосов
/ 11 октября 2018

Я нашел способ выполнения стилей ячеек на основе CSS в TableView на основе содержимого в ячейке.В следующем коде показан пример:

#!/usr/bin/python3

from PyQt5 import QtWidgets, QtGui, QtCore

class_values = ["zero", "one", "two"]

class Cell(QtWidgets.QWidget):
    def initFromItem(self, item):
        self.setProperty('dataClass', class_values[int(item.text())])

class TDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, *a):
        super(TDelegate, self).__init__(*a)
        self.cell = Cell(self.parent())

    def paint(self, painter, option, index):
        item = index.model().itemFromIndex(index)
        self.cell.initFromItem(item)
        self.initStyleOption(option, index)
        style = option.widget.style() if option.widget else QtWidgets.QApplication.style()
        style.unpolish(self.cell)
        style.polish(self.cell)
        style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, option, painter, self.cell)

class TTableModel(QtGui.QStandardItemModel):
    def __init__(self, parent=None):
        super(TTableModel, self).__init__(parent)
        for i in range(5):
            self.appendRow([QtGui.QStandardItem(str((x+i) % 3)) for x in range(5)])

class TTableView(QtWidgets.QTableView):
    def __init__(self, parent=None):
        super(TTableView, self).__init__(parent)
        self.setItemDelegate(TDelegate(self))

class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.table = TTableView(self)
        self.model = TTableModel(self)
        self.table.setModel(self.model)
        self.setCentralWidget(self.table)

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet("""
Cell[dataClass=zero]::item { background-color: gray; }
Cell[dataClass=one]::item { background-color: green; font-style: italic }
Cell[dataClass=two]::item { font-weight: bold }
""")
    mainWin = Main()
    mainWin.show()
    sys.exit(app.exec_())

Это создает таблицу, подобную этой:

TableView со стилем на ячейку

Проблема в том, что пока цвета работают, стиль шрифта не имеет никакого эффекта.Что я делаю неправильно?Как я могу улучшить свой код?И как это работает?Например, почему CSS-селектор должен включать ::item.Все ответы с благодарностью получены.Но имейте в виду, что для проекта очень важна стилизация на основе CSS.

1 Ответ

0 голосов
/ 12 октября 2018

Это связано с ошибкой в ​​qt (v5.9.5), которая игнорирует всю информацию о стилях шрифта при создании CE_ItemViewItem (см. QStyleSheetStyle::drawControl).Обман, создавая что-то еще, например CE_ToolBoxTabLabel (который корректно обрабатывает шрифты в drawControl), дает вам форматирование шрифта, но дает вам цвет, потому что при рендеринге используется палитра лица кнопки, а не та, которая указана в параметре(или связанный CSS).Таким образом, вы можете иметь один или другой, но не оба.Я не знаю обходного пути.

Что касается того, как это работает.В QStyleSheetStyle::drawControl для CE_ItemViewItem выполняется поиск CSS для подчиненной роли ::item и, если она присутствует, применяется к копии опции (но не к стилю шрифта), а затем элемент рисуется на основе обновленноговариант и его обновленная палитра.К сожалению, нет никакого способа взломать этот код, поскольку нет способа применить таблицы стилей из PyQt (так как QStyleSheet не является частью общедоступного API Qt).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...