剪辑小部件的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的主要内容,如果未能解决你的问题,请参考以下文章

Qt - QScrollArea 小部件剪辑内容

颤振剪辑,剪辑的小部件周围没有空间

强制在 contentsRect 而不是 rect 上绘制小部件

在 qt 中使用 2 个图像编写仪表小部件

Qt 气球小部件遮罩

从自定义小部件继承