• 3937阅读
  • 3回复

[提问]2d绘图中的paintEvent究竟是干了些什么 [复制链接]

上一主题 下一主题
离线zh_opera
 
只看楼主 倒序阅读 楼主  发表于: 2012-10-27
在c++ gui qt编程这本书的第五章,有下面这段代码
其中updateRubberBandRegion函数只是一个调用了update的函数,为什么可以把前一次画的橡皮圈消除掉呢??

void Plotter::mouseMoveEvent(QMouseEvent *event)
{
    if (rubberBandIsShown) {
        updateRubberBandRegion();
        rubberBandRect.setBottomRight(event->pos());
        updateRubberBandRegion();
        //注意为什么治理有两个update...,这样可以消除遗留的band,前一个消除,后一个画
    }
}

void Plotter::paintEvent(QPaintEvent * /* event */)
{
    QStylePainter painter(this);
    painter.drawPixmap(0, 0, pixmap);

    if (rubberBandIsShown) {
        painter.setPen(palette().light().color());
        painter.drawRect(rubberBandRect.normalized()
                                       .adjusted(0, 0, -1, -1));
    }

    if (hasFocus()) {
        QStyleOptionFocusRect option;
        option.initFrom(this);
        option.backgroundColor = palette().dark().color();
        painter.drawPrimitive(QStyle::PE_FrameFocusRect, option);
    //drawPrimitive设置绘制基本元素的风格,基本元素指gui中不可再分的东西
    }
}
离线roywillow

只看该作者 1楼 发表于: 2012-10-27
先回答你第一个问题吧,代码暂时没时间看
你的意思大概是,重绘之前应该先把画面中的内容先给擦除?也即update()前要先erase之类的……?
update()究竟做了什么我不清楚,但是update()最后会调用paintEvent(),而paintEvent()每次的绘制是相当于在一个空白画布上进行的,擦除之类的我们不需要在意
如果需要前一次的绘制内容的话,大概只有手动把它保存起来了吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线zh_opera
只看该作者 2楼 发表于: 2012-10-27
回 1楼(roywillow) 的帖子
那如果我在一个地方画了一个正方形,后来又在同一个地方画了一个正方形,那么会怎样啊?
离线roywillow

只看该作者 3楼 发表于: 2012-10-27
回 2楼(zh_opera) 的帖子
如果两个正方形是在两次paintEvent中绘制的话,最后看到的是最后一个正方形
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个