QT委托 边框阴影

// 保存当前 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);
posted @ 2025-01-02 09:02  小松鼠树懒  阅读(88)  评论(0)    收藏  举报