Я использую qdarkstyle в своем графическом интерфейсе PyQt5 и пытаюсь создать виджет с внутренними полями со списком. Все элементы в поле со списком имеют квадратный индикатор слева, который я хочу скрыть.
Я попытался установить таблицу стилей, но безуспешно.
class Panel(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.layout = QVBoxLayout()
self.cb = QComboBox()
self.cb.addItems(["hello", "world"])
self.cb.setStyleSheet(self.getcbstylesheet())
self.layout.addWidget(self.cb)
self.setLayout(self.layout)
def getcbstylesheet(self):
return """
QComboBox::indicator {
background-color: transparent;
selection-background-color: transparent;
color: transparent;
selection-color: transparent;
}
"""
Переместите self.cb.setStyleSheet(self.getcbstylesheet()) после self.setLayout(self.layout).
@eyllanesc это ничего не изменило






Мне удалось это понять — проблема решается с помощью QStyledItemDelegate, а не таблицы стилей. Сначала определите нового делегата:
(Отредактировано на основе ответа musicamante)
from PyQt5.QtWidgets import QApplication, QComboBox, QStyledItemDelegate, QStyleOptionViewItem
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import QModelIndex
class NoIconItemDelegate(QStyledItemDelegate):
def initStyleOption(self, option: QStyleOptionViewItem, index: QModelIndex):
option.decorationPosition = QStyleOptionViewItem.Position.Right
super().initStyleOption(option, index)
Затем мы можем использовать этот делегат для поля со списком.
self.cb.setItemDelegate(NoIconItemDelegate(self.cb.view()))
Правильное место для этого — не paint(), а initStyleOption(), сразу после вызова базовой реализации. Кроме того, обычно хорошей практикой является создание делегатов с соответствующим родительским элементом (обычно представление, которое они в конечном итоге используют, в данном случае это поле со списком view()).
сначала вставьте QComboBox в макет, а затем установите qtstylesheet