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

时间:2016-03-08 20:32:28

标签: qt paintevent

我正在尝试让我的小部件用它接收的每个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)不会改变任何东西。

唤起update()内的paintEvent mousePressEvent()。所以我的矩形随着每次点击而增长。

非常感谢。

3 个答案:

答案 0 :(得分:2)

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

(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(..)包含始终绘制整个窗口小部件区域的指令。 / p>

我不知道在任何情况下我的回答是否完全正确,但我希望更多的新手对update()paintEvent()之间的关系感到困惑,所以我会首先提出这个问题。助剂。

电贺。

答案 1 :(得分:0)

QWidget::paintEvent docs状态

  

当paint事件发生时,更新区域通常是   擦除,所以你在小工具的背景上画画。

所以,在你的例子中可能就是这种情况。

答案 2 :(得分:0)

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