找回密码
 立即注册
收起左侧

怎么才能在执行paintEvent()时先清除屏幕上之前绘制的图形?

3
回复
15144
查看
[复制链接]

尚未签到

来源: 2019-8-16 00:11:33 显示全部楼层 |阅读模式
1Qter豆
我有一个需求:需要在播放的视频中实时绘制人脸框,即人脸框的位置和大小会随着播放时间不断变化,所以我需要在每次执行paintEvent()时先清除屏幕上之前绘制的人脸框然后再重新绘制新的人脸框。请问,我怎么才能在每次执行paintEvent()时先清除屏幕上之前绘制的人脸框呢?我现在每次调用repaint()方法通知paintEvent()进行绘制时,先前绘制的人脸框一直都在,会不断累积。

回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2019-8-16 13:46:09 显示全部楼层
paintEvent()结束后,使用update()更新界面
回复

使用道具 举报

尚未签到

2019-8-16 14:24:04 显示全部楼层
陈代市 发表于 2019-8-16 13:46
paintEvent()结束后,使用update()更新界面

感谢你的回复,请问我怎么判断paintEvent()结束后呢,下面是根据我对您的提议的理解所做的修改,运行后发现问题依然存在,矩形框在屏幕上会不断累积。可以再帮我分析一下吗,谢谢了

void Sample::paintEvent(QPaintEvent *)
{
    QPixmap pixmap(size());
    pixmap.fill(Qt::transparent);

    QPainter painter(&pixmap);
    painter.setPen(Qt::red);
    painter.setBackgroundMode(Qt::TransparentMode);

   //随机生成x,y坐标
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    int test =qrand()%100;

   //这里模仿人脸框
    painter.drawRect(test, test, 50, 50);
    painter.end();  //画完了

    painter.begin(this);  //在Widget上开始绘制
    painter.drawPixmap(0, 0, pixmap);  //在控件上绘制pixmap图像

   //新加代码:paintEvent()结束后,使用update()更新界面
    update();
}
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2019-9-2 08:27:17 显示全部楼层
void Sample::paintEvent(QPaintEvent *)
{
    QPixmap pixmap(size());
    pixmap.fill(Qt::transparent);

    QPainter painter(&pixmap);
    painter.setPen(Qt::red);
    painter.setBackgroundMode(Qt::TransparentMode);

   //随机生成x,y坐标
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    int test =qrand()%100;

   //这里模仿人脸框
    painter.drawRect(test, test, 50, 50);
   

    painter.begin(this);  //在Widget上开始绘制
    painter.drawPixmap(0, 0, pixmap);  //在控件上绘制pixmap图像

    painter.end();  //画完了
   //新加代码:paintEvent()结束后,使用update()更新界面
    update();
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了