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; }