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。所以每次点击我的矩形都会变大。
非常感谢。
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()
之间的关系感到困惑,所以我将提供这个作为急救。
问候。
我试图让我的小部件在收到每个 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。所以每次点击我的矩形都会变大。
非常感谢。
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()
之间的关系感到困惑,所以我将提供这个作为急救。
问候。