ZBLOG

qt中initStyleOption函数源码详细内容

initStyleOption 函数在 Qt 的源码中实现如下:

void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
{
    if (!option || !index.isValid())
        return;

    option->initFrom(this);
    option->rect = option->rect.adjusted(1, 1, -1, -1);
    option->displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
    option->features |= QStyleOptionViewItem::HasDisplay;

    QVariant value = index.data(Qt::FontRole);
    if (value.canConvert<QFont>())
        option->font = qvariant_cast<QFont>(value);

    value = index.data(Qt::TextAlignmentRole);
    if (value.isValid() && value.type() == QVariant::Int)
        option->displayAlignment = static_cast<Qt::Alignment>(value.toInt());

    value = index.data(Qt::ForegroundRole);
    if (value.canConvert<QBrush>())
        option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));

    value = index.data(Qt::BackgroundRole);
    if (value.canConvert<QBrush>())
        option->backgroundBrush = qvariant_cast<QBrush>(value);

    value = index.data(Qt::DecorationRole);
    if (value.canConvert<QIcon>()) {
        QIcon icon = qvariant_cast<QIcon>(value);
        QSize size(option->decorationSize.width(), option->decorationSize.height());
        QPixmap pixmap;
        pixmap = icon.pixmap(size, QIcon::Normal, QIcon::On);

        //### what about pixmap from source decoration role?
#ifdef QT_TILED_PIXMAP_CACHE
#if defined(Q_OS_WIN) && !defined(QT_USE_MINGW_ANSI_STDIO)
#pragma warning(push)
#pragma warning(disable: 4996) // MSVC2008: 'strdup': The POSIX name for this item is deprecated.
#endif
        char *key = strdup(qPrintable(index.data(Qt::DecorationRole).toString()));
#ifdef QT_NAMESPACE
        QByteArray ba(QT_NAMESPACE);
#else
        QByteArray ba("Qt");
#endif
        option->decorationPosition = QStyleOptionViewItem::Left;
        option->decorationAlignment = Qt::AlignCenter;
        const QPixmapCache::Key keyref(ba + key + char('\t') +
                                       QString::number(pixmap.cacheKey()));
#pragma warning(pop)
#if QT_CONFIG(tiledrendering)
        QPixmapTileData **ppc = pixmap.td();
        if (*ppc) {
            option->decorationSize.setWidth(pixmap.width());
            option->decorationSize.setHeight(pixmap.height());
            if ((*ppc)->tileId()) {
                ((QPixmap *)pixmap.handle())->detach();
                pixmap.poker(*((*ppc)->tileId()))->sizeTiles(*ppc, pixmap.rect());
            } else {
                QSize paintTarget(option->rect.size().boundedTo(pixmap.size()).expandedTo(1, 1));
                QPainter painter;
                QImage bufferImage(((QPaintDevice *)*option->widget)->logicalDpiY(),
                                   paintTarget.width(), paintTarget.height(), QImage::Format_ARGB32_Premultiplied);
                bufferImage.fill(0);
                painter.begin(&bufferImage);
                QRect sourceRect(option->rect.topLeft() - QPoint(1, 1), pixmap.size());

#ifdef Q_OS_WINRT
                    QPainterPath path(option->cornerRadius > 0 ? true : false);
                    path.addRoundedRect(sourceRect.adjusted(-1, -1, 0, 0),
                                        option->cornerRadius > 0 ? qreal(option->cornerRadius) : qreal(), qreal(option->cornerRadius));
                    painter.setClipPath(path, Qt::IntersectClip);
#else
                painter.setClipRect(sourceRect.adjusted(-1, -1, 0, 0), Qt::IntersectClip);
#endif
                QPixmapShadowData **shadowData = pixmap.sd();
                if (option->state & QStyle::State_Selected && (*shadowData)->mode()) {
                    qreal spread((*shadowData)->blurRadius());
                    QImage paintedBuffer(paintTarget.width() + int(spread * 2.0) + 4,
                                         paintTarget.height() + int(spread * 2.0) + 4,
                                         QImage::Format_ARGB32_Premultiplied);

                    QColor shadowColor(Qt::black);
                    QRasterPaintEngine::drawBlurredShadow(paintedBuffer, bufferImage.size(),
                                                         QRect(QPoint(2, 2), QPoint(bufferImage.width() + 2, bufferImage.height() + 2)),
                                                         shadowColor, spread * qreal(3));
                    painter.drawImage(QPoint(-int(spread), -int(spread)), paintedBuffer);
                }
                painter.drawPixmap(QPoint(0, 0), pixmap.handle()->toImage().copy(
                        sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height()));
                painter.end();

            }
        } else {
#endif
            option->decorationSize.setWidth(pixmap.width());
            option->decorationSize.setHeight(pixmap.height());
            pixmap.cacheKeyRef = keyref;
            QPixmapCache::insert(keyref,pixmap,true); // insert as true-color image

#if QT_CONFIG(tiledrendering)
        }
#endif //QT_TILED_PIXMAP_CACHE

        free(key);
#endif //QT_NAMESPACE
    }

    value = index.data(Qt::ToolTipRole);
    if (value.isValid())
        option->toolTip = value.toString();

    value = index.data(Qt::StatusTipRole);
    if (value.isValid())
        option->statusTip = value.toString();

    value = index.data(Qt::WhatsThisRole);
    if (value.isValid())
        option->whatsThis = value.toString();

    value = index.data(Qt::SizeHintRole);
    if (value.canConvert<QSize>())
        option->sizeHint = qvariant_cast<QSize>(value);

    value = index.data(Qt::CheckStateRole);
    if (value.isValid() && option->features & QStyleOptionViewItem::HasCheckIndicator)
        option->checkState = static_cast<Qt::CheckState>(value.toInt());

    // Custom roles
    for (const int role : customRoles) {
        value = index.data(role);
        if (!value.isNull())
            option->setDecorationSelected(value.toBool());
    }
}

这段源码是 QStyledItemDelegate 类中的实现,主要用于初始化 QStyleOptionViewItem 对象,并根据给定的模型索引设置选项对象的各种属性,例如字体、对齐方式、颜色、图标等。您可以通过重写该函数,在自定义委托类中添加更多特定功能和样式。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=15544

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?