2

Is there a way to create Qt3DRender.QTextureImage from QImage?

My goal is to place a custom image on a plane in a 3D space.

I only know that QTextureImage can open some raster image files (e.g. .webp) and files such as .jpg.

It can open file from a disk:

material = Qt3DExtras.QNormalDiffuseSpecularMapMaterial()
material.setTextureScale(1)
material.setAmbient(QColor.fromRgbF(1, 1, 1, 0))

image = Qt3DRender.QTextureImage()
image.setSource(QUrl("file:test.jpg"))
material.normal().addTextureImage(image)
plane_entity.addComponent(material)

I want to do something like this:

image.setSource(QImage())
Matphy
  • 1,086
  • 13
  • 21

1 Answers1

1

I did it with a help from Qt community.

QPaintedTextureImage is an abstract class and therefore has to be inherited.

class Image(Qt3DRender.QPaintedTextureImage):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._image = None

    def paint(self, painter):
        rect = QRect(0, 0, self._image.width(), self._image.height())
        painter.drawImage(rect, self._image, rect)

    def set_image(self, image):
        self._image = image
        self.setSize(image.size())
        painter = QPainter()
        self.paint(painter)
self.image = Image()
self.image.set_image(image)  # type(image): QImage
self.material.normal().addTextureImage(self.image)
Matphy
  • 1,086
  • 13
  • 21