Question

J'ai ajouté deux éléments dans un QCombobox avec un séparateur

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

Afin de mettre en évidence la sélection de l'élément avec un style différent, j'ai utilisé QListView pour la vue QCombobox avec la feuille de style

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

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

Maintenant, le problème est que le séparateur n'est pas du tout visible. Il montre un espace blanc vide entre les éléments. Je ne suis pas bon avec les feuilles de styles, donc je n'ai pas beaucoup d'idée claire sur la façon de faire une nouvelle feuille de style pour le séparateur.

Était-ce utile?

La solution

Vous devrez créer une coutume itemDelegate pour votre QListView.

Vous pouvez sous-classe QItemDelegate Pour créer votre propre classe de délégués. Utilisation sizeHint fonction pour définir la taille de votre séparateur et le peindre dans le paint fonction. Vérifiez si les articles sont un séparateur avec 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 );
}

Ensuite, définissez simplement votre délégué personnalisé sur votre listView:

listView->setItemDelegate(new ComboBoxDelegate);.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top