Frage

Ich habe zwei Elemente in einem Qcombobox mit einem Trennzeichen hinzugefügt

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

Um die Auswahl des Elements mit unterschiedlichem Stil hervorzuheben, habe ich QListView für die Qcombobox -Ansicht mit dem Stylesheet AS verwendet

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

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

Das Problem ist nun, dass das Trennzeichen überhaupt nicht sichtbar ist. Es zeigt einen leeren Weißraum zwischen den Gegenständen. Ich bin nicht gut mit Stylesheets, daher habe ich keine klare Vorstellung davon, wie ich ein neues Stylesheet für das Separator erstellen kann.

War es hilfreich?

Lösung

Sie müssen einen Brauch erstellen itemDelegate für dein QListView.

Sie können unterklassen QItemDelegate Um Ihre eigene Delegierklasse zu erstellen. Verwenden sizeHint Funktionieren Sie, um die Größe Ihres Separators festzulegen und in die zu malen paint Funktion. Überprüfen Sie, ob die Elemente ein Trennzeichen mit sind 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 );
}

Setzen Sie dann einfach Ihren benutzerdefinierten Delegierten auf Ihre listView:

listView->setItemDelegate(new ComboBoxDelegate);.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top