我正在学习 QPainter,并且我创建了一个简单的小部件,每次用户单击小部件时,都会出现一个新圆圈。
但是Qt不允许在paintEvent之外进行绘制,所以每次我想画一个新的圆圈时,我都需要使widget区域失效,并重新绘制之前的所有圆圈。这似乎不是很有效 - 如果有数百甚至数千个元素怎么办。
最好不要删除以前的圆圈,我只是在小部件顶部绘制新的圆圈。但是在 Qt 上,如果不先使之前的内容无效(并因此删除),我就无法绘制。
在 Qt 中处理这种情况的推荐方法是什么?
我正在学习 QPainter,并且我创建了一个简单的小部件,每次用户单击小部件时,都会出现一个新圆圈。
但是Qt不允许在paintEvent之外进行绘制,所以每次我想画一个新的圆圈时,我都需要使widget区域失效,并重新绘制之前的所有圆圈。这似乎不是很有效 - 如果有数百甚至数千个元素怎么办。
最好不要删除以前的圆圈,我只是在小部件顶部绘制新的圆圈。但是在 Qt 上,如果不先使之前的内容无效(并因此删除),我就无法绘制。
在 Qt 中处理这种情况的推荐方法是什么?
处理这种情况的推荐方法是使用QGraphicsScene和QGraphicsView,然后使用QGraphicsItems填充场景。根据文档,这正是框架的设计目的。
简而言之,您将覆盖QGraphicsScene::mousePressEvent()
,并在新方法中创建一个new QGraphicsEllipseItem
.
无需使整个小部件无效。update() 和 repaint() 可以获取您想要重新绘制的坐标,因此只重新绘制更改的部分。
void update ( int x, int y, int w, int h )
void update ( const QRect & rect )
void update ( const QRegion & rgn )
void repaint ( int x, int y, int w, int h )
void repaint ( const QRect & rect )
void repaint ( const QRegion & rgn )