diff --git a/docs/index.rst b/docs/index.rst index 6d72a6f..6b901b0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1196,9 +1196,14 @@ flags for compiling and linking against Python on your system. ChangeLog ========= -Version 1.6.0 (2022-08-05) +Version UNRELEASED (YYYY-MM-DD) ------------------------------- +* Support for Qt 6.5 and newer (backwards-incompatible ``Q_RETURN_ARG()`` change) (fixes #128) + +Version 1.6.0 (2022-08-05) +-------------------------- + * Support for **Qt 6** (Qt 5 is still supported for now) * Use ``PyUnicode_AsUTF8`` from Python 3.3 when converting strings; strings returned from the converter are now valid as long as the ``PyObject`` is alive (previously diff --git a/src/qpython_priv.cpp b/src/qpython_priv.cpp index 4a78fd2..687f9e4 100644 --- a/src/qpython_priv.cpp +++ b/src/qpython_priv.cpp @@ -405,8 +405,25 @@ pyotherside_QObjectMethod_call(PyObject *callable_object, PyObject *args, PyObje } QVariant result; +#if QT_VERSION < QT_VERSION_CHECK(6, 5, 0) + QGenericReturnArgument returnArg = Q_RETURN_ARG(QVariant, result); +#else + /** + * Starting with Qt 6.5, Q_RETURN_ARG() expands to a QMetaMethodReturnArgument, + * whereas previously it returned a QGenericReturnArgument. Since we are using + * the old, deprecated QMetaMethod::invoke() functions, and those take a + * QGenericReturnArgument and not a QMetaMethodReturnArgument, we need to + * create the QGenericReturnArgument ourselves by emulating what Q_RETURN_ARG() + * does in old Qt versions before 6.5. + * + * See also: + * https://bugreports.qt.io/browse/QTBUG-113147 + * https://github.com/thp/pyotherside/issues/128 + **/ + QGenericReturnArgument returnArg {QT_STRINGIFY(QVariant), &result}; +#endif if (method.invoke(o, Qt::DirectConnection, - Q_RETURN_ARG(QVariant, result), genericArguments.value(0), + returnArg, genericArguments.value(0), genericArguments.value(1), genericArguments.value(2), genericArguments.value(3), genericArguments.value(4), genericArguments.value(5), genericArguments.value(6),