如何在QGraphicsScene中无需复制即可显示QImage

时间:2015-08-19 17:03:50

标签: c++ qt qgraphicsscene qimage

我有自己的图像类,其中包含带RGB值的unsigned char数组。我想在QGraphicsScene中显示存储在此类中的图像,而不复制它们。我可以用

创建一个QImage
QImage image(data, width, height, width * 3, QImage::Format_RGB888);

不复制我的图片。如何在没有深层数据副本的情况下在QGraphicsScene中显示图像?

2 个答案:

答案 0 :(得分:1)

使用默认的栅格绘制引擎/后端,顶级窗口小部件的内容存储为QImage。在其上绘制QImage(和QPixmap)也很快,不涉及副本。带有光栅后端的QPixmap内部只是一个QImage,其格式与后备存储的格式相同。像素图通常不代表任何本机资源句柄 - 因为您使用光栅后端,除非您明确要求其他内容。

因此,您希望在drawImage实施中直接从源图像中QGraphicsItem::paint。幕后真正发生的是paint在后​​备存储上执行 - QImage,这是快速有效的。您使用的QPainterQImage上运行!

您所要做的就是实现类似于QGraphicsImageItem的{​​{1}}。只要您的源图像具有与支持顶级窗口的图像相同的格式,就不会涉及复制和格式转换。你怎么知道的?只需询问支持商店它的格式。

QGraphicsPixmapItem

我将QImage::Format backingStoreFormat(QWidget * widget) { auto store = dynamic_cast<QImage*>(widget->backingStore()->paintDevice()) return store ? store->format() : QImage::Format_Invalid; } 的实现留给了读者:)

答案 1 :(得分:0)

为了显示图像,QPixmap是一个合适的类。 QGraphicsScene只为QPixmap提供了一种方法。

QGraphicsPixmapItem * QGraphicsScene::addPixmap(const QPixmap & pixmap)

但是,QPixmap是用于显示图像的优化类,因此无法使用现有内存块创建。因此,如果您打算在QGraphicsScene中将您的内存数据显示为图像,那么似乎是不可能的(通过合理的努力)。

为什么要关注将类中的数据复制到QPixmap中?有证据表明它会成为一个表演瓶颈吗?

如果没有,您可以将您的类直接转换为QPixmap或使用QPixmap :: fromImage()。 添加例如:

添加图像
myScene->addPixmap( QPixmap::fromImage(myImage) );