[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