22#include <QApplication>
24#include <QtGuiVersion>
27 : QStyledItemDelegate(parent)
28 , m_iconSize(iconSize)
29 , m_updateParentHeight(false)
30 , m_uniformItemSizes(false)
39 m_updateParentHeight = update;
44 m_uniformItemSizes = uniform;
54 QStyleOptionViewItem opt = option;
55 initStyleOption(&opt, index);
57 const QWidget* w = opt.widget;
58 const QStyle* style = w ? w->style() : QApplication::style();
59 const Qt::LayoutDirection direction = w ? w->layoutDirection() : QApplication::layoutDirection();
61 const QPalette::ColorRole colorRole = opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text;
63 QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled;
64 if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active)) {
65 cg = QPalette::Inactive;
69 opt.palette.setColor(QPalette::All, QPalette::HighlightedText, opt.palette.color(QPalette::Active, QPalette::Text));
70 opt.palette.setColor(QPalette::All, QPalette::Highlight, opt.palette.base().color().darker(108));
73 QPalette textPalette = opt.palette;
74 textPalette.setCurrentColorGroup(cg);
76 int topPosition = opt.rect.top() + m_padding;
79 opt.showDecorationSelected =
true;
80 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, w);
83 QRect iconRect(opt.rect.left() + (opt.rect.width() - m_iconSize) / 2, topPosition, m_iconSize, m_iconSize);
84 QRect visualIconRect = style->visualRect(direction, opt.rect, iconRect);
85 QPixmap pixmap = index.data(Qt::DecorationRole).value<QIcon>().pixmap(m_iconSize);
86 painter->drawPixmap(visualIconRect, pixmap);
87 topPosition += m_iconSize + m_padding;
90 const QString title = index.data(Qt::DisplayRole).toString();
91 const int leftTitleEdge = opt.rect.left() + m_padding;
92 QRect titleRect(leftTitleEdge, topPosition, opt.rect.width() - 2 * m_padding, opt.fontMetrics.height());
93 QRect visualTitleRect = style->visualRect(direction, opt.rect, titleRect);
94 style->drawItemText(painter, visualTitleRect, Qt::AlignCenter, textPalette,
true, title, colorRole);
100 QStyleOptionViewItem opt(option);
101 initStyleOption(&opt, index);
103 const QWidget* w = opt.widget;
104 const QStyle* style = w ? w->style() : QApplication::style();
105 const int padding = style->pixelMetric(QStyle::PM_FocusFrameHMargin,
nullptr) + 1;
107 m_padding = padding > 5 ? padding : 5;
109 m_itemHeight = 3 * m_padding + opt.fontMetrics.height() + m_iconSize;
112 QWidget* p = qobject_cast<QWidget*>(parent());
113 if (p && m_updateParentHeight) {
114 int frameWidth = p->style()->pixelMetric(QStyle::PM_DefaultFrameWidth,
nullptr, p);
115 p->setFixedHeight(m_itemHeight + 2 * frameWidth);
118 int width = 2 * m_padding + option.fontMetrics.horizontalAdvance(index.data(Qt::DisplayRole).toString());
119 width = width > (m_iconSize + 2 * m_padding) ? width : m_iconSize + 2 * m_padding;
121 if (m_uniformItemSizes) {
122 if (width > m_itemWidth) {
130 return QSize(width, m_itemHeight);
void setUpdateParentHeight(bool update)
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
ListItemDelegate(int iconSize, QWidget *parent)
void setUniformItemSizes(bool uniform)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override