eventFilter的paint事件触发后无法清空QLabel内容应如何解决?
QLabel调用clear()无法清空内容的问题解决
问题根源
你自定义了lbl_capture的绘制逻辑,没有使用QLabel原生的文本/像素图渲染能力,而是直接读取成员变量captured_img的内容完成绘制。QLabel自带的clear()方法仅能清空其自身管理的文本、内置像素图资源,不会修改你自行存储的captured_img变量,因此重绘时依然会渲染旧的图像数据。
正确解决方法
按照以下两步修改代码即可:
- 清空
captured_img数据并触发重绘 - 在自定义绘制逻辑中增加空图像判断,空图时走QLabel默认渲染逻辑
修改后的代码示例
1. 修改ChangeModeSlot槽函数
void Form::ChangeModeSlot(){ /*Do some other stuffs before clear the label content*/ captured_img.release(); // 清空自行存储的图像数据 ui->lbl_capture->clear(); // 清空QLabel原生存储的内容 ui->lbl_capture->update(); // 主动触发重绘刷新界面 }
2. 修改eventFilter绘制判断逻辑
bool Form::eventFilter(QObject *watched, QEvent *event){ if(watched == ui->lbl_capture && event->type() == QEvent::Paint){ // 图像为空时返回false,走QLabel默认绘制逻辑,展示clear后的空白状态 if(captured_img.empty()){ return false; } QPainter painter(ui->lbl_capture); painter.setRenderHint(QPainter::SmoothPixmapTransform, true); QImage img((const unsigned char *)(captured_img.data), captured_img.cols, captured_img.rows, captured_img.step1(), QImage::Format_RGB888); QRectF target(0, 0, ui->lbl_capture->width(), ui->lbl_capture->height()); QRectF source(0, 0, img.width(), img.height()); painter.drawImage(target,img, source); return true; } return false; }
内容的提问来源于stack exchange,提问作者Phạm Hồng Nhung
相关产品推荐
相关产品推荐

