Как добавить таблицу стилей для сепаратора в Qcombobox

StackOverflow https://stackoverflow.com/questions/19828160

  •  20-07-2022
  •  | 
  •  

Вопрос

Я добавил два элемента в Qcombobox с сепаратором

addItem("New");
addItem("Delete");
insertSeparator(2);

Чтобы выделить выбор элемента с различным стилем, который я использовал QlistView для просмотра Qcombobox с таблицей стилей как

QListView * listView = new QListView(this);
this->setView(listView);

listView->setStyleSheet("QListView::item {                              \
                            color: black;                                    \
                            background: white;                           }  \
                            QListView::item:selected {                     \
                            color: white;                                  \
                            background-color: #0093D6  \
                            }                                               \
                            ");

Теперь проблема в том, что сепаратор вообще не видна. Он показывает пустое белое пространство между предметами. Я не в порядке с таблицами стилей, поэтому у меня нет много ясного представления о том, как сделать новую таблицу стилей для разделителя ..

Это было полезно?

Решение

Вам придется создать пользовательский itemDelegate для тебя QListView.

Вы можете подкласс QItemDelegate Чтобы создать свой собственный класс делегатов. Использовать sizeHint функционируйте, чтобы установить размер вашего сепаратора и нарисовать его в paint функция Проверьте, является ли элементы сепаратором с index.data(Qt::AccessibleDescriptionRole).toString().

#ifndef COMBOBOXDELEGATE_H
#define COMBOBOXDELEGATE_H

#include <QItemDelegate>

class ComboBoxDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    explicit ComboBoxDelegate(QObject *parent = 0);

protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

#endif // COMBOBOXDELEGATE_H

 

void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(index.data(Qt::AccessibleDescriptionRole).toString() == QLatin1String("separator"))
    {
        painter->setPen(Qt::red);
        painter->drawLine(option.rect.left(), option.rect.center().y(), option.rect.right(), option.rect.center().y());
    }
    else
        QItemDelegate::paint(painter, option, index);
}

QSize ComboBoxDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QString type = index.data(Qt::AccessibleDescriptionRole).toString();
    if(type == QLatin1String("separator"))
        return QSize(0, 2);
    return QItemDelegate::sizeHint( option, index );
}

Тогда просто установите свой собственный делегат на свой listView:

listView->setItemDelegate(new ComboBoxDelegate);.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top