[PyQt] Not getting it re sip.voidptr
David Cortesi
davecortesi at gmail.com
Sun Nov 4 17:34:32 GMT 2012
>> When I try assignment,
>> vptr[1] = 0x00
>> I get the message,
>> TypeError: 'int' does not have the buffer interface
> I can't reproduce this - can you send a short, complete test that
> demonstrates the problem.
Here you go: Ubuntu 12.10, PyQt4 4.9.3-4
$ python
Python 2.7.3 (default, Sep 26 2012, 21:53:58)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from PyQt4 import QtCore, QtGui
>>> img = QtGui.QImage(100,100,QtGui.QImage.Format_ARGB32)
>>> img.fill(0xdeadbeef)
>>> vptr = img.bits()
>>> vptr.setsize(img.byteCount())
>>> vptr[0] = 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' does not have the buffer interface
>>>
Particularly helpful for this use-case (QImage) would be the ability
to set or retrieve 32-bit words via the voidptr. It isn't obvious to
me how to get and set ARGB words from the image data accessed this
way. The following seems awkward, and I am dubious it would be any
faster than just calling img.pixel() --
def get_pixel_as_word( vptr, pixno ) :
offset = pixno<<2
return (vptr[offset] << 12) | (vptr[1+offset] << 8) |
vptr[2+offset] << 4) | vptr[3+offset]
More pythonic and maybe faster:
def get_pixel_as_tuple( vptr, pixno ) :
offset = pixno<<2
return (vptr[offset], vptr[1+offset], vptr[2+offset], vptr[3+offset])
More information about the PyQt
mailing list