You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Qt如何在QImage上叠加绘制图片,为QTableWidgetItem图标添加标记

Qt 实现图像角标标记的内置方案

Qt 完全提供了内置实现方式,不需要手动遍历像素处理,核心依赖 QPainter 绘制类即可完成需求,效率比自行遍历像素高很多,且自动支持透明通道混合。

实现步骤

  • 预加载星形标记资源:建议将星形图存为带透明通道的 PNG 格式,全局仅加载一次为 QPixmap 类型(更适配绘制场景,性能优于 QImage)
  • 对需要打标记的差异图像开启绘制上下文,指定角落坐标直接绘制星形即可
  • 绘制完成后将处理好的图像绑定到 QTableWidgetItem 中使用

示例代码

// 全局预加载星形标记,不要在循环中重复加载
QPixmap starMark(":/resources/star.png");

// 处理差异图像
QImage diffImage = 待标记的差异QImage对象;
{
    // 开启目标图像的绘制上下文
    QPainter painter(&diffImage);
    painter.setRenderHint(QPainter::Antialiasing);
    // 计算右上角绘制坐标,可自行调整为左上、右下等其他角落位置
    int drawPosX = diffImage.width() - starMark.width();
    int drawPosY = 0;
    // 自动混合透明通道,仅保留星形有效像素
    painter.drawPixmap(drawPosX, drawPosY, starMark);
}

// 绑定到QTableWidgetItem
QTableWidgetItem* item = new QTableWidgetItem(QIcon(QPixmap::fromImage(diffImage)), "");
tableWidget->setItem(行索引, 列索引, item);

特殊场景适配

如果你的星形图是无透明通道的白底黑星素材,可以添加遮罩过滤白色背景,效果和你手动判断深色像素再绘制完全一致:

starMark.setMask(starMark.createHeuristicMask());

如果需要调整星形大小、透明度,可以用内置API直接实现:

// 缩放到32*32尺寸
starMark = starMark.scaled(32, 32, Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 绘制前设置半透明效果
painter.setOpacity(0.7);

内容的提问来源于stack exchange,提问作者taiga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:24:04