剪辑小部件的paintEvent
Posted
技术标签:
【中文标题】剪辑小部件的paintEvent【英文标题】:Clipping in a widget's paintEvent 【发布时间】:2015-04-09 17:35:51 【问题描述】:我在 Qt 中遇到了剪辑问题。我有一个小部件,我在其中绘制了一大堆矩形。由于我只是不时更改几个矩形,因此我只想绘制小部件的一小部分(仅这些矩形)并将绘制区域剪辑到这些部分。
isNew()
函数为真,如果矩形接收到自上次绘制以来的新颜色。
void Environment::paintEvent(QPaintEvent *event)
QPainter painter (this);
Tile t;
//paint the matrix
for(int i=0; i<size; ++
t = matrix[i+j*yizeY];
if(t.isNew())
painter.setClipRegion(QRegion(t.getRect()));
painter.setBrush(t.getColor());
painter.drawRect(t.getRect());
t.used();
我做错了什么?当我使用setClipRegion(...)
函数时,我的程序运行得更慢了。
【问题讨论】:
但是你为什么使用clipRegion
?你有什么收获?海事组织什么都没有!在此代码中,您不会剪裁任何内容,您只需对剪裁只会削弱性能的内容进行无用检查。
@Mark R. 我理解 clipRegion
错了。我认为这会阻止程序绘制所有新内容。相反,它只检查剪辑区域并且不允许在那里进行更改。你说的对。这减慢了程序的速度。
您设置的剪切区域等于绘制的矩形。在这段代码中,只剪掉了心脏的表现,没有剪掉任何东西。
【参考方案1】:
如果您想提高性能,您可以在 QPixmap 上绘制所有这些矩形。由于您可以随时绘制到像素图,因此您可以在需要更新时将图块直接绘制到像素图。在绘画事件中,您只需绘制“已经渲染的”像素图。
这样您就不必记住更改了哪些图块,并且可以避免循环遍历整个矩阵。
【讨论】:
其实是一个很明显的解决方案。它工作完美。我只是将 QPainter 传递给像素图,然后让每个对象直接绘制。谢谢!以上是关于剪辑小部件的paintEvent的主要内容,如果未能解决你的问题,请参考以下文章