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
相关产品推荐
相关产品推荐

