Delegate QComboBox в QTableView светится серым

PyQT5 Добавляю делегат QComboBox в QtableView, а он светится серым


from PyQt5 import QtWidgets, QtCore

from qtmodels.delegates.custom_roles import CustomRoles

__all__ = ['ComboBoxDelegate']


class ComboBoxDelegate(QtWidgets.QStyledItemDelegate):
    choice_clicked = QtCore.pyqtSignal(QtCore.QModelIndex)

    def __init__(self, owner, choices):
        super().__init__(owner)
        self.items = choices

    def createEditor(self, parent, option, index):
        self.editor = QtWidgets.QComboBox(parent)
        self.editor.addItems(self.items)
        return self.editor

    def paint(self, painter, option, index):
        value = index.data(QtCore.Qt.ItemDataRole.DisplayRole)
        style = QtWidgets.QApplication.style()
        opt = QtWidgets.QStyleOptionComboBox()
        opt.text = str(value)
        opt.rect = option.rect
        style.drawComplexControl(QtWidgets.QStyle.ComplexControl.CC_ComboBox, opt, painter)
        super().paint(painter, option, index)


    def setEditorData(self, editor, index):
        value = index.data(QtCore.Qt.ItemDataRole.DisplayRole)
        num = self.items.index(value)
        editor.setCurrentIndex(num)

    def setModelData(self, editor, model, index):
        value = editor.currentText()
        if value == model.commands_name[0]:
            model.setData(index, value, CustomRoles.TakeoffRole)
            self.choice_clicked.emit(index)
        elif value == model.commands_name[1]:
            model.setData(index, value, CustomRoles.WaypointRole)
        elif value == model.commands_name[2]:
            model.setData(index, value, CustomRoles.ConditionYawRole)
            self.choice_clicked.emit(index)
        elif value == model.commands_name[3]:
            model.setData(index, value, CustomRoles.ReturnToLaunchRole)
            self.choice_clicked.emit(index)
        elif value == model.commands_name[4]:
            model.setData(index, value, CustomRoles.LandRole)
            self.choice_clicked.emit(index)
        else:
            model.setData(index, value, QtCore.Qt.ItemDataRole.EditRole)

    def updateEditorGeometry(self, editor, option, index):
        editor.setGeometry(option.rect)

Пока не нажать - серый


Ответы (2 шт):

Автор решения: Alexander Chernin

Это вам надо поработать с палитрой:

opt = QtWidgets.QStyleOptionComboBox()
opt.palette

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

def paint(self, painter, option, index):
    value = index.data(QtCore.Qt.ItemDataRole.DisplayRole)

    # Создаем нужный виджет 
    combo = QComboBox()
    # Устанавливаем его размеры
    combo.setGeomerty(option.rect)

    # Устанавливаем значение
    combo.addItem(str(value))

    # Создаем пиксмап, на который отрендерим сам виджет 
    # в текущем состоянии и который, ниже, отрисуем в ячейке
    pixmap = QPixmap(option.rect)

    # Рендерим виджет на пиксмап
    combo.render(pixmap)

    # Рисуем пиксмап на канве ячейки
    painter.drawPixmap(option.rect.topLeft(), pixmap)
→ Ссылка
Автор решения: Генерал Гавс

PS: paint() тут ни при чем, все упиралось в css у QTableView QTableView::item { background-color: white; }

→ Ссылка