// 保存当前 painter 状态
painter->save();
// 设置抗锯齿以获得更平滑的边缘
painter->setRenderHint(QPainter::Antialiasing, true);
// 创建矩形,代表要绘制的区域
QRectF rect = option.rect.adjusted(1, 1, -1, -1); // 调整矩形以适应线条宽度
// 定义阴影偏移和模糊半径
int shadowOffset = 0;
int blurRadius = 2;
// 创建项内容路径(不带阴影)
QPainterPath itemPath;
itemPath.addRoundedRect(rect, 2, 2);
// 检查是否需要绘制高亮(鼠标悬停)
if (option.state & QStyle::State_MouseOver)
{
// 设置抗锯齿以获得更平滑的边缘
painter->setRenderHint(QPainter::Antialiasing, true);
// 创建项内容路径(带阴影和圆角)
itemPath.addRoundedRect(rect, 4, 4); // 第二个参数是水平半径,第三个参数是垂直半径
// 保存当前 painter 状态
painter->save();
// 使用组合模式来绘制背景颜色
painter->setCompositionMode(QPainter::CompositionMode_SourceAtop);
painter->fillPath(itemPath, option.palette.highlight());
}
// 创建阴影路径,只包括外边框
QPainterPath shadowPath;
QRectF outerRect = rect.adjusted(-blurRadius - shadowOffset, -blurRadius - shadowOffset,
blurRadius + shadowOffset, blurRadius + shadowOffset);
shadowPath.addRoundedRect(outerRect, 4 + blurRadius, 4 + blurRadius);
shadowPath -= itemPath; // 减去内侧部分,确保阴影只出现在外边框
// 创建阴影画刷
QColor shadowColor(0, 0, 0, 64); // 半透明黑色
QBrush shadowBrush(shadowColor);
// 使用组合模式来绘制阴影,确保只有外边框有阴影
painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
painter->fillPath(shadowPath, shadowBrush);
// 恢复 painter 状态并调用基类方法绘制实际项内容
painter->restore();
QStyledItemDelegate::paint(painter, option, index);