2016-03-08 289 views
0

我试图让我的部件画一个矩形,它接收到的每个paintEvent。矩形应该一次增加1px,填满一个正方形。然而,我得到的只是最新的(也是最大的)矩形。Qt:为什么我的paintEvent()在执行任务前抹去所有东西?

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()内部引发paintEvent I update()。所以我的矩形随着每次点击而增长。

非常感谢。

+0

您只能看到最大的正方形,因为它完全覆盖了之前绘制的所有较小的正方形。你期望看到什么? – Flopp

+0

@Flopp这很有趣,谢谢。矩形没有填充,所以我没有想到他们能够覆盖任何东西。我会看看我能否证实这一点。 – Jersey

+0

恩,你说得对;你的代码应该绘制一个未填充的矩形。 – Flopp

回答

1

因此,要回答我的问题,我发现:

(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()之间的关系感到困惑,所以我会提供这个作为急救。

迎接。

0

QWidget::paintEvent docs状态

当油漆事件发生时,更新区域已正常 删除,因此,您所画小部件的背景。

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

+0

那么,“通常”是指良好的编程标准还是存在工作中的Qt机制?我想我误解了qt是如何完成绘画的。我认为任何与paintEvent()内部绘制小部件有关的东西都会发生。 – Jersey

0

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

相关问题