I implementing a custom QStyledItemDelegate
and want to know decoration QRect
in sizeHint()
method to calculate correct size hint for my items.
I tried:
QSize
WordWrapItemDelegate::sizeHint( const QStyleOptionViewItem & option,
const QModelIndex & index ) const
{
QStyleOptionViewItem opt = option;
initStyleOption( &opt, index );
opt.rect = { 0, 0, m_parent->header()->sectionSize( index.column() ), 0 };
QStyle * style = opt.widget ? opt.widget->style() : QApplication::style();
auto iconRect = style->subElementRect( QStyle::SE_ItemViewItemDecoration, &opt, opt.widget );
qDebug() << iconRect;
return option.fontMetrics.boundingRect(
QRect( 0, 0,
m_parent->header()->sectionSize( index.column() ) -
option.decorationSize.width() /** level * 2*/, 0 ),
Qt::AlignLeft | Qt::TextWordWrap,
index.data( Qt::DisplayRole ).toString() ).size();
}
And:
QSize
WordWrapItemDelegate::sizeHint( const QStyleOptionViewItem & option,
const QModelIndex & index ) const
{
int level = 1;
auto i = index;
while( i.parent().isValid() )
{
++level;
i = i.parent();
}
return option.fontMetrics.boundingRect(
QRect( 0, 0,
m_parent->header()->sectionSize( index.column() ) -
option.decorationSize.width() * level * 2, 0 ),
Qt::AlignLeft | Qt::TextWordWrap,
index.data( Qt::DisplayRole ).toString() ).size();
}
The second variant works, but, as you can see, I use some hard-coding option.decorationSize.width() * level * 2
.
In the first variant in iconRect
set Y
only, but I need a width of a decoration.
Do anybody know how to know the width of the decoration in item?