ZBLOG

qt中initStyleOption函数源码详细内容

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

  1. void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const
  2. {
  3. if (!option || !index.isValid())
  4. return;
  5. option->initFrom(this);
  6. option->rect = option->rect.adjusted(1, 1, -1, -1);
  7. option->displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
  8. option->features |= QStyleOptionViewItem::HasDisplay;
  9. QVariant value = index.data(Qt::FontRole);
  10. if (value.canConvert<QFont>())
  11. option->font = qvariant_cast<QFont>(value);
  12. value = index.data(Qt::TextAlignmentRole);
  13. if (value.isValid() && value.type() == QVariant::Int)
  14. option->displayAlignment = static_cast<Qt::Alignment>(value.toInt());
  15. value = index.data(Qt::ForegroundRole);
  16. if (value.canConvert<QBrush>())
  17. option->palette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
  18. value = index.data(Qt::BackgroundRole);
  19. if (value.canConvert<QBrush>())
  20. option->backgroundBrush = qvariant_cast<QBrush>(value);
  21. value = index.data(Qt::DecorationRole);
  22. if (value.canConvert<QIcon>()) {
  23. QIcon icon = qvariant_cast<QIcon>(value);
  24. QSize size(option->decorationSize.width(), option->decorationSize.height());
  25. QPixmap pixmap;
  26. pixmap = icon.pixmap(size, QIcon::Normal, QIcon::On);
  27. //### what about pixmap from source decoration role?
  28. #ifdef QT_TILED_PIXMAP_CACHE
  29. #if defined(Q_OS_WIN) && !defined(QT_USE_MINGW_ANSI_STDIO)
  30. #pragma warning(push)
  31. #pragma warning(disable: 4996) // MSVC2008: 'strdup': The POSIX name for this item is deprecated.
  32. #endif
  33. char *key = strdup(qPrintable(index.data(Qt::DecorationRole).toString()));
  34. #ifdef QT_NAMESPACE
  35. QByteArray ba(QT_NAMESPACE);
  36. #else
  37. QByteArray ba("Qt");
  38. #endif
  39. option->decorationPosition = QStyleOptionViewItem::Left;
  40. option->decorationAlignment = Qt::AlignCenter;
  41. const QPixmapCache::Key keyref(ba + key + char('\t') +
  42. QString::number(pixmap.cacheKey()));
  43. #pragma warning(pop)
  44. #if QT_CONFIG(tiledrendering)
  45. QPixmapTileData **ppc = pixmap.td();
  46. if (*ppc) {
  47. option->decorationSize.setWidth(pixmap.width());
  48. option->decorationSize.setHeight(pixmap.height());
  49. if ((*ppc)->tileId()) {
  50. ((QPixmap *)pixmap.handle())->detach();
  51. pixmap.poker(*((*ppc)->tileId()))->sizeTiles(*ppc, pixmap.rect());
  52. } else {
  53. QSize paintTarget(option->rect.size().boundedTo(pixmap.size()).expandedTo(1, 1));
  54. QPainter painter;
  55. QImage bufferImage(((QPaintDevice *)*option->widget)->logicalDpiY(),
  56. paintTarget.width(), paintTarget.height(), QImage::Format_ARGB32_Premultiplied);
  57. bufferImage.fill(0);
  58. painter.begin(&bufferImage);
  59. QRect sourceRect(option->rect.topLeft() - QPoint(1, 1), pixmap.size());
  60. #ifdef Q_OS_WINRT
  61. QPainterPath path(option->cornerRadius > 0 ? true : false);
  62. path.addRoundedRect(sourceRect.adjusted(-1, -1, 0, 0),
  63. option->cornerRadius > 0 ? qreal(option->cornerRadius) : qreal(), qreal(option->cornerRadius));
  64. painter.setClipPath(path, Qt::IntersectClip);
  65. #else
  66. painter.setClipRect(sourceRect.adjusted(-1, -1, 0, 0), Qt::IntersectClip);
  67. #endif
  68. QPixmapShadowData **shadowData = pixmap.sd();
  69. if (option->state & QStyle::State_Selected && (*shadowData)->mode()) {
  70. qreal spread((*shadowData)->blurRadius());
  71. QImage paintedBuffer(paintTarget.width() + int(spread * 2.0) + 4,
  72. paintTarget.height() + int(spread * 2.0) + 4,
  73. QImage::Format_ARGB32_Premultiplied);
  74. QColor shadowColor(Qt::black);
  75. QRasterPaintEngine::drawBlurredShadow(paintedBuffer, bufferImage.size(),
  76. QRect(QPoint(2, 2), QPoint(bufferImage.width() + 2, bufferImage.height() + 2)),
  77. shadowColor, spread * qreal(3));
  78. painter.drawImage(QPoint(-int(spread), -int(spread)), paintedBuffer);
  79. }
  80. painter.drawPixmap(QPoint(0, 0), pixmap.handle()->toImage().copy(
  81. sourceRect.x(), sourceRect.y(), sourceRect.width(), sourceRect.height()));
  82. painter.end();
  83. }
  84. } else {
  85. #endif
  86. option->decorationSize.setWidth(pixmap.width());
  87. option->decorationSize.setHeight(pixmap.height());
  88. pixmap.cacheKeyRef = keyref;
  89. QPixmapCache::insert(keyref,pixmap,true); // insert as true-color image
  90. #if QT_CONFIG(tiledrendering)
  91. }
  92. #endif //QT_TILED_PIXMAP_CACHE
  93. free(key);
  94. #endif //QT_NAMESPACE
  95. }
  96. value = index.data(Qt::ToolTipRole);
  97. if (value.isValid())
  98. option->toolTip = value.toString();
  99. value = index.data(Qt::StatusTipRole);
  100. if (value.isValid())
  101. option->statusTip = value.toString();
  102. value = index.data(Qt::WhatsThisRole);
  103. if (value.isValid())
  104. option->whatsThis = value.toString();
  105. value = index.data(Qt::SizeHintRole);
  106. if (value.canConvert<QSize>())
  107. option->sizeHint = qvariant_cast<QSize>(value);
  108. value = index.data(Qt::CheckStateRole);
  109. if (value.isValid() && option->features & QStyleOptionViewItem::HasCheckIndicator)
  110. option->checkState = static_cast<Qt::CheckState>(value.toInt());
  111. // Custom roles
  112. for (const int role : customRoles) {
  113. value = index.data(role);
  114. if (!value.isNull())
  115. option->setDecorationSelected(value.toBool());
  116. }
  117. }

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


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?