Qt:重新实现的paintEvent(QPaintEvent*)是否执行隐藏的背景工作? 我现在正在用QT4(BLANCHET/SAMEMELD)咀嚼C++ GUI编程。在第五天。第二章介绍了绘制数据集的基本小部件,包括缩放功能和通过手动绘制的橡皮筋选择视图(不使用QRubberBand)

Qt:重新实现的paintEvent(QPaintEvent*)是否执行隐藏的背景工作? 我现在正在用QT4(BLANCHET/SAMEMELD)咀嚼C++ GUI编程。在第五天。第二章介绍了绘制数据集的基本小部件,包括缩放功能和通过手动绘制的橡皮筋选择视图(不使用QRubberBand),c++,qt,C++,Qt,要手动绘制rubberband,小部件将重新实现绘制事件的处理程序: void Plotter::paintEvent(QPaintEvent * /* event */) { QStylePainter painter(this); painter.drawPixmap(0, 0, pixmap); //This widget is always drawn from a pixmap if (rubberBandIsShown) { painter.

要手动绘制rubberband,小部件将重新实现绘制事件的处理程序:

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+rubberband)。但是,在另一个函数中,作者多次调用
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());
}
现在我的问题是:为什么上面的更新计划用于小部件的特定矩形,而绘制事件记录任何位置信息并绘制整个小部件?我不能在没有参数的情况下调用一次
update()

paint事件处理程序的实现中没有任何部分使用任何矩形或区域(无
event->rect()
或类似),除非我严重误解了某些内容,或者
paintEvent(…)
比它的实现更聪明,并且完成了我不知道的其他背景工作

非常感谢


我正在Windows 8.1 x64上使用Qt 4.8.6和g++4.8.2。几个连续调用
update
将只生成一个绘制事件。有很好的记录。可以使用
repaint
方法强制重新绘制。Qt在它的绘图引擎中实现了双缓冲。@SaZ你说得对,我忘记了更新是由Qt智能管理的,在可能的情况下保存绘制事件。我稍微修改了我的问题。在您的情况下,将完成完全重新绘制。几个连续调用
update
将只生成一个绘制事件。有很好的记录。可以使用
repaint
方法强制重新绘制。Qt在它的绘图引擎中实现了双缓冲。@SaZ你说得对,我忘记了更新是由Qt智能管理的,在可能的情况下保存绘制事件。我稍微修改了我的问题。在你的情况下,将完成完全重新喷漆。