Pergunta

Eu adicionei dois itens em um qcombobox com um separador

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

Para destacar a seleção do item com estilo diferente, usei o QLISTVIEW para a visão QCombobox com a folha de estilo

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

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

Agora, o problema é que o separador não está visível. Está mostrando um espaço branco vazio entre os itens. Não sou bom com folhas de estilo, então não tenho muita ideia de como fazer uma nova folha de estilo para o separador.

Foi útil?

Solução

Você terá que criar um costume itemDelegate Para o seu QListView.

Você pode subclasse QItemDelegate Para criar sua própria classe de delegados. Usar sizeHint função para definir o tamanho do seu separador e pintá -lo no paint função. Verifique se os itens são um separador com 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 );
}

Em seguida, basta definir seu delegado personalizado para o seu listView:

listView->setItemDelegate(new ComboBoxDelegate);.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top