// Convert a Python Unicode object to a QString. QString qpycore_PyObject_AsQString(PyObject *obj) { #if defined(PYQT_PEP_393) SIP_SSIZE_T len = PyUnicode_GET_LENGTH(obj); switch (PyUnicode_KIND(obj)) { case PyUnicode_1BYTE_KIND: return QString::fromLatin1((char *)PyUnicode_1BYTE_DATA(obj), len); case PyUnicode_2BYTE_KIND: // The (QChar *) cast should be safe. return QString((QChar *)PyUnicode_2BYTE_DATA(obj), len); case PyUnicode_4BYTE_KIND: #if QT_VERSION >= 0x040200 return QString::fromUcs4(PyUnicode_4BYTE_DATA(obj), len); #else // Note that this code doesn't handle code points greater than 0xffff // very well. QString qstr; Py_UCS4 *ucode = PyUnicode_4BYTE_DATA(obj); for (SIP_SSIZE_T i = 0; i < len; ++i) qstr.append((uint)ucode[i]); return qstr; #endif } return QString(); #elif defined(Py_UNICODE_WIDE) #if QT_VERSION >= 0x040200 return QString::fromUcs4((const uint *)PyUnicode_AS_UNICODE(obj), PyUnicode_GET_SIZE(obj)); #else // Note that this code doesn't handle code points greater than 0xffff very // well. QString qstr; Py_UNICODE *ucode = PyUnicode_AS_UNICODE(obj); SIP_SSIZE_T len = PyUnicode_GET_SIZE(obj); for (SIP_SSIZE_T i = 0; i < len; ++i) qstr.append((uint)ucode[i]); return qstr; #endif #else return QString::fromUtf16((const ushort *)PyUnicode_AS_UNICODE(obj), PyUnicode_GET_SIZE(obj)); #endif }
// Convert a Python Unicode object to a QString. QString qpycore_PyObject_AsQString(PyObject *obj) { #if defined(PYQT_PEP_393) SIP_SSIZE_T len = PyUnicode_GET_LENGTH(obj); switch (PyUnicode_KIND(obj)) { case PyUnicode_1BYTE_KIND: return QString::fromLatin1((char *)PyUnicode_1BYTE_DATA(obj), len); case PyUnicode_2BYTE_KIND: // The (QChar *) cast should be safe. return QString((QChar *)PyUnicode_2BYTE_DATA(obj), len); case PyUnicode_4BYTE_KIND: return QString::fromUcs4(PyUnicode_4BYTE_DATA(obj), len); } return QString(); #elif defined(Py_UNICODE_WIDE) return QString::fromUcs4((const uint *)PyUnicode_AS_UNICODE(obj), PyUnicode_GET_SIZE(obj)); #else return QString::fromUtf16((const ushort *)PyUnicode_AS_UNICODE(obj), PyUnicode_GET_SIZE(obj)); #endif }