[PyQt] Containers of pointers to MappedTypes
Phil Thompson
phil at riverbankcomputing.com
Thu Feb 24 12:49:27 GMT 2011
On Fri, 18 Feb 2011 13:55:09 -0800, Nate Reid <gnatty7 at hotmail.com> wrote:
> I have a MappedType for std::string, and I wrote a test sip file that
does
> conversion to and from a QList<std::string> and QList<std::string*> and
I
> get compile errors with the auto-generated code based on the following
> stubs:
> // SipStlTester.h
>
> class SipStlTester
>
> {
>
> ...
>
> QList<std::string> listToListSP(const QList<std::string>
> & input);
>
> QList<std::string *> listToListSP(const QList<std::string *>
> & input);
>
> ...
>
> }
>
>
>
> // SipStlTester.sip
>
> %Module TestSTLTypes 0
>
>
>
> %Import util.sip
>
> %Import QtCore/QtCoremod.sip
>
> class SipSTLTester
>
> {
>
> %TypeHeaderCode
>
> #include "SipSTLTester.h"
>
> %End
>
> public:
>
> SipSTLTester();
>
> ...
>
> QList<std::string> listToListS (const
> QList<std::string> & input);
>
> QList<std::string *> listToListSP(const QList<std::string
> *> & input);
>
> ...
>
> };
>
>
>
> Here is the autogenerated method for the function that fails:
listToListSP
> static PyObject *meth_SipSTLTester_listToListSP(PyObject *sipSelf,
> PyObject *sipArgs)
> {
> PyObject *sipParseErr = NULL;
>
> {
> const QList<std::string> * a0;
> int a0State = 0;
> SipSTLTester *sipCpp;
>
> if (sipParseArgs(&sipParseErr, sipArgs, "BJ1", &sipSelf,
> sipType_SipSTLTester, &sipCpp, sipType_QList_0100std_string,&a0,
> &a0State))
> {
> QList<std::string> *sipRes;
>
> Py_BEGIN_ALLOW_THREADS
> sipRes = new QList<std::string>(sipCpp->listToListSP(*a0));
> Py_END_ALLOW_THREADS
> sipReleaseType(const_cast<QList<std::string>
> *>(a0),sipType_QList_0100std_string,a0State);
>
> return
>
sipConvertFromNewType(sipRes,sipType_QList_0100std_string,NULL);
> }
> }
>
> /* Raise an exception if the arguments couldn't be parsed. */
> sipNoMethod(sipParseErr, sipName_SipSTLTester, sipName_listToListSP,
> NULL);
>
> return NULL;
> }
>
> As you can see, it creates sipRes as a QList<std::string> rather than as
> the appropriate type of QList<std::string*>
> std::string is a mapped type which the following definition:
>
> %MappedType std::string
> {
> %TypeHeaderCode
> #include <string>
> %End
>
> %ConvertFromTypeCode
> if (!sipCpp) {
> Py_INCREF(Py_None);
> return Py_None;
> }
> // convert an std::string to a Python string
> return PyString_FromString(sipCpp->c_str());
> %End // ConvertFromTypeCode
>
> %ConvertToTypeCode
> if (sipIsErr == NULL) {
> return PyString_Check(sipPy);
> }
> if (sipPy == Py_None) {
> *sipCppPtr = new std::string;
> return 1;
> }
> if (PyString_Check(sipPy)) {
> *sipCppPtr = new std::string(PyString_AS_STRING(sipPy));
> return 1;
> }
> return 0;
> %End // ConvertToTypeCode
>
> };
>
>
> I am unable to make a mapped type for std::string* since that type of
> MappedType doesn't seem to be supported by SIP. So, in the MappedType
for
> QList, there is one that _should_ support pointers to TYPE, e.g.
> // QtCore/qlist.sip
> // QList<TYPE *> is implemented as a Python list.
> template<TYPE>
> %MappedType QList<TYPE *> /DocType="list-of-TYPE"/
> {
> %TypeHeaderCode
> #include <qlist.h>
> %End
> ...
>
> So, I would hope that it would autogenerate code for QList<std::string*>
> but SIP doesn't appear to be doing this.
>
> I've verified this with Sip v. 4.10 and Sip 4.11.2
>
> Thanks!
> -Nate
Fixed in hg.
Thanks,
Phil
More information about the PyQt
mailing list