如何有效地更改非常大的QPixmap的一小部分?

时间:2015-07-24 07:54:43

标签: qt graphics

在Qt中绘制一个小部件非常简单。首先,您创建一个QPixmap,为其分配QPainter,使用QPainter绘制,最后将pixmap设置为小部件。 例如,

QPixmap pixmap(ui->label->width(), ui->label->height());
pixmap.fill(background_color);
QPainter painter(&pixmap)
painter.setpen(foreground_color);
//painter.drawLine(....) etc.
ui->label->setPixmap(pixmap);

到目前为止一切顺利。

然而,如果像素图非常大,我必须经常改变它的一小部分呢?在我的情况下,我把它描述为我的瓶颈。我们可以加载现有的像素图,只对其进行必要的更改,而不是创建新的像素图并将旧图像复制到其上。但是,它仍然很慢。

Pixmap pixmap = *(ui->label->pixmap());  // takes almost zero time
QPainter painter(&pixmap);               // takes up 40% of the time
//draw stuff with painter                // takes almost zero time
ui->label->setPixmap(pixmap);            // takes up 60% of the time

即使我重新使用画家以便我不必每次都创建它,我仍然需要调用setPixMap(pixmap),否则图像不会刷新。

有办法吗?

我是否必须嵌入OpenGL窗口或类似的东西,或者只使用本机Qt类?请注意,图像中的变化非常小并占用了不大的时间,这是整个像素图的重绘,这非常耗时。由于我事先并不知道我将在何处进行更改,因此将像素图分割为多个小标签会非常复杂。

1 个答案:

答案 0 :(得分:1)

如果您使用的是大型QLabel,那么使用QGraphicsSceneQGraphicsView会更好。

场景允许您添加项目,视图是一个小部件,就像一个看着场景的窗口。

您可以先添加QGraphicsPixmapItem,但我认为您最好从QGraphicsItem派生,存储QPixmap并在其绘图功能中渲染图像。

以下是派生类标题

的示例
class MyImage : public QGraphicsItem
{
    public:
        MyImage(QGraphicsItem* parent);

        QRectF boundingRect();

        void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0);

     protected:
         void QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent * event)

     private:
         QPixmap m_pixmap;
}

在绘画功能中,使用QPainter绘制m_pixmap;