[PyQt] wchar_t type mapping

Diez B. Roggisch deets at web.de
Sat Jun 20 18:52:02 BST 2009


Hi,

I want to wrap a method with the following signature:

virtual irr::gui::IGUIStaticText* addStaticText(const wchar_t* text, 
const irr::core::rect<irr::s32>& rectangle,
						      bool border=false, bool wordWrap=true, 
irr::gui::IGUIElement* parent=0, irr::s32 id=-1,
						      bool fillBackground = false) = 0;


All types are mapped or declared, and compilation succeeds.

However, on calling the function, Python barks with



Traceback (most recent call last):
   File "hello_world.py", line 64, in <module>
     main()
   File "hello_world.py", line 45, in main
     True);
TypeError: argument 1 of IGUIEnvironment.addStaticText() has an invalid type



So I tried to map the wchar_t from and to PyUnicode-objects. But this 
gives me an error that says

mac-dir:IrrSinn-1.5 deets$ python2.6 setup.py install
running install
running build
running build_ext
building 'irrlicht' extension
/Library/Frameworks/Python.framework/Versions/2.6/bin/sip -c 
build/temp.macosx-10.3-i386-2.6 -b 
build/temp.macosx-10.3-i386-2.6/irr.sbf irr.sip
sip: types.sip:613: Invalid type for %MappedType
error: command 
'/Library/Frameworks/Python.framework/Versions/2.6/bin/sip' failed with 
exit status 1


The mapping looks like this:

%MappedType wchar_t*
{
%TypeHeaderCode
#include <wchar.h>
%End

%ConvertFromTypeCode
   if (!sipCpp)
     return Py_None;
   wchar_t *s = (wchar_t*)sipCpp;
   return PyUnicode_FromWideChar(s, wcslen(s));
%End

%ConvertToTypeCode
    if (sipIsErr == NULL) {
      return PyUnicode_Check(sipPy);
    }
   if (sipPy == Py_None) {
     *sipCppPtr = NULL;
     return 0;
   }
   Py_ssize_t len = PyUnicode_GET_SIZE(sipPy);
   wchar_t *w = malloc(sizeof(wchar_t) * len + 1);
   w[len] = 0;
   PyUnicode_AsWideChar(PyUnicodeObject *unicode, wchar_t *w, Py_ssize_t 
size);
   PyUnicode_AsWideChar(sipPy, w, len);
   *sipCppPtr = w;
   return 1;
%End
};



Any suggestions? Of course if anything else fails, I could manually wrap 
the methods in question - but I'd rather spare myself that effort.

Diez


More information about the PyQt mailing list