如何知道QStyledItemDelegate中sizeHint()方法中公开了QRect?

问题描述 投票:0回答:1

我实现了自定义

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中披露的宽度吗?

qt6
1个回答
0
投票

我对

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 }

© www.soinside.com 2019 - 2024. All rights reserved.