我实现了自定义
QStyledItemDelegate
并想知道 QRect
方法中的披露 sizeHint()
来计算我的商品的正确尺寸提示。
我尝试过:
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_TreeViewDisclosureItem, &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();
}
并且:
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();
}
第二个变体有效,但是,如您所见,我使用了一些硬编码
option.decorationSize.width() * level * 2
。
在第一个变体中,我总是得到与选项中相同的矩形。
有人知道如何知道item中披露的宽度吗?
我对
QStyle
的理解完全错误。可以通过以下代码给出披露宽度。
QSize
WordWrapItemDelegate::sizeHint( const QStyleOptionViewItem & option,
const QModelIndex & index ) const
{
const auto w = QApplication::style()->pixelMetric( QStyle::PM_TreeViewIndentation );
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() ) - w * level, 0 ),
Qt::AlignLeft | Qt::TextWordWrap,
index.data( Qt::DisplayRole ).toString() ).size();
}
请注意,我使用
style()->pixelMetric( QStyle::PM_TreeViewIndentation )
返回一级披露的宽度。我被迫计算嵌套级别并乘以它。
仅此而已。这是正确的解决方案。
确实知道,在选项矩形中的
paint()
方法中已经具有该偏移量,它是在某处计算的。因此,如果您的项目在 { 0, 0, 200, 30}
方法中具有矩形 paint()
,您将拥有该矩形,例如 { 40, 0, 160, 30 }
。