如何在QGraphicsScene中显示不复制的QImage
How to show a QImage without copying in QGraphicsScene
我有自己的图像类,其中包含具有RGB值的无符号字符数组。我想在QGraphicsScene中显示存储在该类中的图像,而不复制它们。我可以用
创建一个QImageQImage image(data, width, height, width * 3, QImage::Format_RGB888);
不复制我的图像。我如何在没有数据的深度拷贝的QGraphicsScene中显示图像?
使用默认的栅格绘制引擎/后端,顶级小部件的内容存储为QImage
。在上面画一个QImage
(和一个QPixmap
)是快速的,不涉及副本。具有光栅后端的QPixmap
在内部只是一个QImage
,具有与后备存储相同的格式。pixmap通常不代表任何本地资源句柄——因为你使用的是栅格后端,除非你明确地要求其他东西。
因此,您希望做的是在QGraphicsItem::paint
实现中直接从源图像中获取drawImage
。在幕后真正发生的是paint
在后备存储上执行——一个QImage
,这是快速和高效的。您使用的QPainter
对QImage
进行操作!
你所要做的就是实现类似于QGraphicsPixmapItem
的QGraphicsImageItem
。只要您的源图像与支持顶层窗口的图像具有相同的格式,就不会涉及复制和格式转换。你怎么知道的?只要问后台存储它是什么格式。
QImage::Format backingStoreFormat(QWidget * widget) {
auto store = dynamic_cast<QImage*>(widget->backingStore()->paintDevice())
return store ? store->format() : QImage::Format_Invalid;
}
我把QGraphicsImageItem
的实现留给读者:)
对于显示图像QPixmap是一个合适的类。QGraphicsScene提供了一个QPixmap的方法。
QGraphicsPixmapItem * QGraphicsScene::addPixmap(const QPixmap & pixmap)
然而,QPixmap是一个用于显示图像的优化类,所以它不能用现有的内存块创建。因此,如果您打算在QGraphicsScene中显示您的内存数据作为图像,这似乎是不可能的(合理的努力)。
为什么你关心从你的类复制数据到QPixmap?是否有证据表明,这将是一个性能瓶颈?
如果没有,要么直接将类转换为QPixmap,要么使用QPixmap::fromImage()。添加您的图像,例如:
myScene->addPixmap( QPixmap::fromImage(myImage) );
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 从缓冲区创建Qimage,没有深层复制
- 将QImage的像素复制到数组的最快方法是什么?
- 如何在QGraphicsScene中显示不复制的QImage