问:重新实现的paintEvent(QPaintEvent *)是否隐藏了后台工作?

时间:2016-03-05 12:32:35

标签: c++ qt

我正在用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。

0 个答案:

没有答案