Qt:为什么我的 paintEvent() 在完成它的工作之前擦除所有内容?

Qt: Why does my paintEvent() erase everything before doing its job?

我试图让我的小部件在收到每个 paintEvent 时都绘制一个矩形。矩形的大小应该一次增加 1px,填满一个正方形。然而,我得到的只是最新的(也是最大的)矩形。

void TestClass::paintEvent(QPaintEvent* e){
    static int size = 1;
    QStylePainter painter(this);
    painter.setPen(Qt::blue);
    painter.drawRect(QRect(50, 50, size, size));
    size++;
}

我不明白为什么会这样。我希望画家只是在已经存在的东西上作画。相反,它似乎删除了之前绘制的矩形,随时给我留下一个矩形。有什么想法吗?

setAutoFillBackground(true/false) 除了背景颜色之外没有任何改变。

mousePressEvent() 中唤起我 update() 的 paintEvent。所以每次点击我的矩形都会变大。

非常感谢。

QWidget::paintEvent docs 指出

When the paint event occurs, the update region has normally been erased, so you are painting on the widget's background.

那么,您的示例中可能就是这种情况。

您不能保证在 paintEvent 的调用之间进行任何形式的状态保存。这是它的长短。 paintEvent 实现的唯一正确语义是:绘制(至少)传递给您的整个区域,如:触摸每个像素,除非您的小部件在绘制之前已预先清除。

所以,为了回答我自己的问题,我发现:

(1) update(QRect area) 在执行任何其他操作之前擦除其参数指定的区域。调用不带参数的更新会擦除整个小部件区域。

(2) 已清除的区域是唯一可以进行任何绘画的区域,即使您的 paintEvent() 看起来要在其他地方绘画。小部件未触及的部分不受影响。

例如,考虑这个 paintEvent()

void myWidget::paintEvent(QPaintEvent* e){
    QPainter painter(this);
    static int counter = 1;

    if (counter % 2){
        painter.fillRect(0, 0, 199, 199, Qt::blue); //Fill with blue color
    } else {
        painter.fillRect(0, 0, 199, 199, Qt::green); //Fill with green color
    }
    counter++;
}

重复调用 update() 将为每个像素在绿色和蓝色之间切换。然而,在调用 update(QRect(0, 0, 50, 50)) 时,只有小部件区域的左上四分之一会改变颜色,其他像素将保持不变,即使 paintEvent(..) 包含始终在整个小部件区域上绘画的指令。

我不知道我的回答在任何情况下是否完全正确,但我希望更多菜鸟对 update()paintEvent() 之间的关系感到困惑,所以我将提供这个作为急救。

问候。