我正在用Qt4(Blanchette / Summerfield)咀嚼C ++ GUI编程。在第5章中,给出了绘制数据集的基本小部件,包括缩放功能和通过手动绘制的橡皮带(不使用QRubberBand)选择视图。
要手动绘制橡皮筋,小部件会重新实现绘制事件的处理程序:
void Plotter::paintEvent(QPaintEvent * /* event */)
{
QStylePainter painter(this);
painter.drawPixmap(0, 0, pixmap); //This widget is always drawn from a pixmap
if (rubberBandIsShown) {
painter.setPen(palette().light().color());
painter.drawRect(rubberBandRect.normalized()
.adjusted(0, 0, -1, -1));
}
...
}
请注意,处理程序不使用任何参数,它看起来好像它总是绘制整个小部件(如果需要,pixmap +橡皮带)。但是,在另一个函数中,作者多次调用update(QRect)
,指定要更新的区域:
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());
}
现在我的问题是:为什么上面的更新会安排在窗口小部件的特定矩形上,而paint事件会扼杀任何位置信息并绘制整个窗口小部件?难道我不能在没有参数的情况下调用update()
一次吗?
paint事件处理程序的实现中没有任何部分使用任何矩形或区域(没有event->rect()
或类似),除非我误解了一些可怕的东西或paintEvent(..)
比它的实现和其他背景更聪明工作已经完成,我不知道。
非常感谢。
我在Windows 8.1 x64上使用Qt 4.8.6和g ++ 4.8.2。