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助手提供,问题来源于学员提问