• 6457阅读
  • 1回复

关于plotter描画橡皮筋矩形框的问题 [复制链接]

上一主题 下一主题
离线ding404
 
只看楼主 倒序阅读 楼主  发表于: 2010-06-08
最近在看C++ Programming GUI Qt 4一书的第五章,其中有一个例子叫plotter。其中有三段段函数如下
void Plotter::mouseMoveEvent(QMouseEvent *event)
{
    if (rubberBandIsShown) {
        updateRubberBandRegion();
        rubberBandRect.setBottomRight(event->pos());
        updateRubberBandRegion();
    }
}

void Plotter::updateRubberBandRegion()
{
    QRect rect = rubberBandRect.normalized();
    update(rect.left(), rect.top(), rect.width(), 1);
    update(rect.left(), rect.top(), 1, rect.height());
    update(rect.left(), rect.bottom(), rect.width(), 1);
    update(rect.right(), rect.top(), 1, rect.height());
}

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);
    }
}

其功能是实现当鼠标左键点着拖动的时候,能够画出一个想橡皮筋一样的伸缩自如的矩形框,但是在mouseMoveEvent中调用了两次updateRubberBandRegion();,书中说第一次是为了擦除原先老的矩形框,第二次是描画新的矩形框。但是我有两点不明白:
1.为什么第一次的updateRubberBandRegion();能够擦除原先老的矩形框呢?
2.updateRubberBandRegion中的四次调用update是将最终调用上面的void Plotter::paintEvent吗?还是会调用其他的事件响应函数? 其效果到底是重新描绘这个矩形的整个区域,还是只是重新描绘矩形的边框,还是重新描绘整个plotter widget?

请大侠指教
离线ding404
只看该作者 1楼 发表于: 2010-06-10
没有人知道吗?
快速回复
限100 字节
 
上一个 下一个