我有自己的图像类,其中包含带RGB值的unsigned char数组。我想在QGraphicsScene中显示存储在此类中的图像,而不复制它们。我可以用
创建一个QImageQImage image(data, width, height, width * 3, QImage::Format_RGB888);
不复制我的图片。如何在没有深层数据副本的情况下在QGraphicsScene中显示图像?
答案 0 :(得分:1)
使用默认的栅格绘制引擎/后端,顶级窗口小部件的内容存储为QImage
。在其上绘制QImage
(和QPixmap
)也很快,不涉及副本。带有光栅后端的QPixmap
内部只是一个QImage
,其格式与后备存储的格式相同。像素图通常不代表任何本机资源句柄 - 因为您使用光栅后端,除非您明确要求其他内容。
因此,您希望在drawImage
实施中直接从源图像中QGraphicsItem::paint
。幕后真正发生的是paint
在后备存储上执行 - QImage
,这是快速有效的。您使用的QPainter
在QImage
上运行!
您所要做的就是实现类似于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) );