1

我试图让我的小部件用它收到的每个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()。所以我的矩形随着每次点击而增长。

非常感谢。

4

3 回答 3

3

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

(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()所以我会提供这个作为急救。

问候。

于 2016-03-10T19:45:44.147 回答
0

不能保证在调用paintEvent. 这就是它的长处和短处。您实现的唯一正确语义paintEvent是:绘制(至少)传递给您的整个区域,例如:触摸每个像素,除非您的小部件在绘制之前被预先清除。

于 2016-03-08T21:37:03.093 回答
0

QWidget ::paintEvent 文档指出

当绘制事件发生时,更新区域通常已被擦除,因此您正在小部件的背景上进行绘制。

因此,您的示例中可能就是这种情况。

于 2016-03-08T21:34:17.290 回答