我在带有分隔符的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 \
} \
");
现在问题是分隔符根本不可见..它在项目之间显示空白空格。我对样式表不太满意,所以我对如何为分隔符制作新的样式表没有太多明确的想法。
答案 0 :(得分:5)
您必须为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);
。