From 79f585f483ecca18b267de4e62eb726f91183a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Capelle?= Date: Sun, 11 Aug 2024 16:56:20 +0200 Subject: [PATCH] Add extra classes for QVariant conversion. --- src/mobase/mobase.cpp | 3 +- src/pybind11-qt/pybind11_qt_basic.cpp | 49 ++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/mobase/mobase.cpp b/src/mobase/mobase.cpp index 7387be9..3f80de5 100644 --- a/src/mobase/mobase.cpp +++ b/src/mobase/mobase.cpp @@ -79,7 +79,8 @@ PYBIND11_MODULE(mobase, m) // m.add_object( "MoVariant", - py::eval("None | bool | int | str | list[object] | dict[str, object]")); + py::eval( + "None | bool | int | str | float | list[object] | dict[str, object]")); // same thing for GameFeatureType // diff --git a/src/pybind11-qt/pybind11_qt_basic.cpp b/src/pybind11-qt/pybind11_qt_basic.cpp index d82ec2b..6a0f117 100644 --- a/src/pybind11-qt/pybind11_qt_basic.cpp +++ b/src/pybind11-qt/pybind11_qt_basic.cpp @@ -2,12 +2,17 @@ #include +#include +#include +#include + #include #include "pybind11_qt/details/pybind11_qt_utils.h" // need to import containers to get QVariantList and QVariantMap #include "pybind11_qt/pybind11_qt_containers.h" +#include "pybind11_qt/pybind11_qt_objects.h" namespace pybind11::detail { @@ -81,7 +86,18 @@ namespace pybind11::detail { 2 * src.length(), nullptr, 0); } - bool type_caster::load(handle src, bool) + template + bool tryCast(QVariant& value, handle src, bool implicit) + { + type_caster caster; + if (caster.load(src, implicit)) { + value = caster.value; + return true; + } + return false; + } + + bool type_caster::load(handle src, bool implicit) { // test for string first otherwise PyList_Check also works if (PyBytes_Check(src.ptr()) || PyUnicode_Check(src.ptr())) { @@ -119,6 +135,15 @@ namespace pybind11::detail { value = src.cast(); return true; } + else if (PyFloat_Check(src.ptr())) { + value = src.cast(); + return true; + } + else if (tryCast(value, src, implicit) || + tryCast(value, src, implicit) || + tryCast(value, src, implicit)) { + return true; + } else { return false; } @@ -131,13 +156,25 @@ namespace pybind11::detail { case QMetaType::UnknownType: return Py_None; case QMetaType::Int: + case QMetaType::Long: return PyLong_FromLong(var.toInt()); + case QMetaType::LongLong: + return PyLong_FromLongLong(var.toLongLong()); case QMetaType::UInt: + case QMetaType::ULong: return PyLong_FromUnsignedLong(var.toUInt()); + case QMetaType::ULongLong: + return PyLong_FromUnsignedLongLong(var.toULongLong()); + case QMetaType::Float: + return PyFloat_FromDouble(var.toFloat()); + case QMetaType::Double: + return PyFloat_FromDouble(var.toDouble()); case QMetaType::Bool: return PyBool_FromLong(var.toBool()); + case QMetaType::QString: return type_caster::cast(var.toString(), policy, parent); + // We need to check for StringList here because these are not considered // List since List is QList will StringList is QList: case QMetaType::QStringList: @@ -146,6 +183,16 @@ namespace pybind11::detail { return type_caster::cast(var.toList(), policy, parent); case QMetaType::QVariantMap: return type_caster::cast(var.toMap(), policy, parent); + + case QMetaType::QColor: + return type_caster::cast(var.value(), policy, parent); + + case QMetaType::QIcon: + return type_caster::cast(var.value(), policy, parent); + + case QMetaType::QPixmap: + return type_caster::cast(var.value(), policy, parent); + default: { PyErr_Format(PyExc_TypeError, "type unsupported: %d", var.userType()); throw pybind11::error_already_set();