Pregunta

Agregué dos elementos en un QComboBox con un separador

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

Para resaltar la selección del elemento con un estilo diferente, utilicé QListView para la vista QcomboBoBox con la hoja de estilo como

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

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

Ahora el problema es que el separador no es visible en absoluto. Está mostrando un espacio en blanco vacío entre los elementos. No soy bueno con las hojas de estilo, así que no tengo mucha idea clara sobre cómo hacer una nueva hoja de estilo para el separador.

¿Fue útil?

Solución

Tendrás que crear una personalización itemDelegate para tu QListView.

Puedes subclase QItemDelegate Para crear su propia clase delegada. Usar sizeHint función para establecer el tamaño de su separador y pintarlo en el paint función. Compruebe si los elementos son un separador con 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 );
}

Luego, configure su delegado personalizado en su listView:

listView->setItemDelegate(new ComboBoxDelegate);.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top