2015-02-09 54 views
0

我在Qt中剪裁时遇到问题。我有一个小部件,我在其中绘制了一大排矩形。由于我只是不时地改变几个矩形,所以我只想绘制小部件的一小部分(仅限这些矩形),并将绘制区域剪切到这些部分。在小部件的paintEvent中剪切

如果矩形自上一次绘画以来接收到新的颜色,则isNew()函数为true。

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(...)函数时,我的程序运行速度更慢。

+1

但为什么你使用'clipRegion'?你有什么收获? IMO什么都没有在这段代码中,你不会夹任何东西,你只是强制执行无用的检查来削减什么只会削弱性能。 – 2015-02-09 22:50:20

+0

@Mark R.我了解'clipRegion'错误。我认为这会阻止该程序绘制新的东西。相反,它只是检查裁剪区域,并且不允许更改。你是对的。这放慢了程序。 – Jonas 2015-02-21 12:16:34

+0

您正在设置与所绘制的矩形相等的剪辑区域。在这个代码只剪辑心脏的表现,没有任何被剪切。 – 2015-02-21 19:34:56

回答

1

如果您想提高性能,可以在QPixmap上绘制所有这些矩形。由于您可以随时绘制到像素图,因此您可以在需要更新时直接将图块绘制到像素图。在绘画事件中,您只需绘制“已渲染的”像素图。

这样,您不必记住哪些瓷砖发生了变化,并且可以避免遍历整个矩阵。

+0

其实是一个很明显的解决方案。它工作完美。我只是通过QPainter的像素图,让每个对象直接绘制。谢谢! – Jonas 2015-02-22 15:36:01