我正在尝试让我的小部件用它接收的每个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()
。所以我的矩形随着每次点击而增长。
非常感谢。
答案 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)
答案 2 :(得分:0)
在paintEvent
的调用之间,您无法保证任何形式的状态保留。这是它的长短。 paintEvent
实现的唯一正确语义是:绘制(至少)传递给你的整个区域,如:触摸每个像素,除非你的小部件在绘画之前被预先清除。