最近在看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?
请大侠指教