diff --git a/src/PythonQt.cpp b/src/PythonQt.cpp index 95d34cc..5a89025 100644 --- a/src/PythonQt.cpp +++ b/src/PythonQt.cpp @@ -81,6 +81,7 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName) PythonQt_init_QtCoreBuiltin(NULL); PythonQt_init_QtGuiBuiltin(NULL); + PythonQtRegisterToolClassesTemplateConverter(QByteArray); PythonQtRegisterToolClassesTemplateConverter(QDate); PythonQtRegisterToolClassesTemplateConverter(QTime); PythonQtRegisterToolClassesTemplateConverter(QDateTime); diff --git a/src/PythonQtConversion.cpp b/src/PythonQtConversion.cpp index ae504ef..b6587ea 100644 --- a/src/PythonQtConversion.cpp +++ b/src/PythonQtConversion.cpp @@ -146,10 +146,11 @@ PyObject* PythonQtConv::ConvertQtValueToPythonInternal(int type, const void* dat return PyLong_FromLongLong(*((qint64*)data)); case QMetaType::ULongLong: return PyLong_FromUnsignedLongLong(*((quint64*)data)); - case QMetaType::QByteArray: { - QByteArray* v = (QByteArray*) data; - return PyString_FromStringAndSize(*v, v->size()); - } + // implicit conversion from QByteArray to str has been removed: + //case QMetaType::QByteArray: { + // QByteArray* v = (QByteArray*) data; + // return PyString_FromStringAndSize(*v, v->size()); + // } case QMetaType::QVariantMap: return PythonQtConv::QVariantMapToPyObject(*((QVariantMap*)data)); case QMetaType::QVariantList: @@ -689,6 +690,7 @@ QString PythonQtConv::PyObjGetString(PyObject* val, bool strict, bool& ok) { } QByteArray PythonQtConv::PyObjGetBytes(PyObject* val, bool /*strict*/, bool& ok) { + // TODO: support buffer objects in general QByteArray r; ok = true; if (val->ob_type == &PyString_Type) { diff --git a/src/PythonQtDoc.h b/src/PythonQtDoc.h index ac7eeda..4ebdbbd 100644 --- a/src/PythonQtDoc.h +++ b/src/PythonQtDoc.h @@ -146,7 +146,7 @@ - QObject.emit to emit Qt signals from Python is not yet implemented but PythonQt allows to just emit a signal by calling it - PythonQt does not (yet) offer to add new signals to Python/C++ objects - Ownership of objects is a bit different in PythonQt, currently Python classes derived from a C++ class need to be manually referenced in Python to not get deleted too early (this will be fixed) - - QString and QBytearray are always converted to unicode and str Python objects (PyQt returns QString and QByteArray instead). + - QStrings are always converted to unicode Python objects (PyQt returns QString instead), we prefered to return Python strings. - Probably there are lots of details that differ, I do not know PyQt that well to list them all. \section Interface diff --git a/src/PythonQtInstanceWrapper.cpp b/src/PythonQtInstanceWrapper.cpp index 576f2de..eefdca3 100644 --- a/src/PythonQtInstanceWrapper.cpp +++ b/src/PythonQtInstanceWrapper.cpp @@ -566,6 +566,17 @@ static QString getStringFromObject(PythonQtInstanceWrapper* wrapper) { static PyObject * PythonQtInstanceWrapper_str(PyObject * obj) { PythonQtInstanceWrapper* wrapper = (PythonQtInstanceWrapper*)obj; + + // QByteArray should be directly returned as a str + if (wrapper->classInfo()->metaTypeId()==QVariant::ByteArray) { + QByteArray* b = (QByteArray*) wrapper->_wrappedPtr; + if (b->data()) { + return PyString_FromStringAndSize(b->data(), b->size()); + } else { + return PyString_FromString(""); + } + } + const char* typeName = obj->ob_type->tp_name; QObject *qobj = wrapper->_obj; QString str = getStringFromObject(wrapper);