كيفية إضافة ورقة الأنماط للفاصل في 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