[PyQt] Faster transparency from a QImage?
Matt Newell
newellm at blur.com
Tue Jun 17 22:59:17 BST 2008
On Tuesday 17 June 2008 13:17:00 Jeiel Aranal wrote:
> Is there a faster way to draw transparency on a QWidget from a QImage
> other than converting the QImage to a pixmap and setting that as the
> mask? I'm trying to have a 3d window draw into PyQt, the window output
> is going in fast enough but getting the alpha of the 3d window into
> the mask is being way too slow for my purpose. My paint event:
>
> def paintEvent(self, event):
> if self.pandaTexture.mightHaveRamImage():
> self.pandaTexture.setFormat(Texture.FRgba32)
> #print "Should draw yes?"
> data = self.pandaTexture.getRamImage().getData()
> img = QtGui.QImage(data, self.pandaTexture.getXSize(),
> self.pandaTexture.getYSize(), QtGui.QImage.Format_ARGB32).mirrored()
> self.paintSurface.begin(self)
> self.paintSurface.drawPixmap(0, 0, self.desktopBg)
> self.paintSurface.drawImage(0, 0, img)
> self.paintSurface.end()
> pixmap = QtGui.QPixmap.fromImage(img)
> self.setMask(pixmap.mask())
I think QWidget.setMask will always be slow. I think the only way to
accomplish a changing mask is to use a visual that supports a true alpha
channel, instead of using setMask.
You will also need to avoid so many copies of the data depending on how fast
you need it. The code above has at least 3 copies, possibly 5, plus the
pixmap.mask and QWidget.setMask calls. This is probably fine if the image is
small, but will be prohibitively slow if the image is large.
The details of doing this will vary somewhat depending on what platform you
are using.
Matt
More information about the PyQt
mailing list