aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2025-09-26 14:56:39 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2025-10-01 16:04:42 +0200
commit60d5a5b05041e05556becbf1ce6efada6e477421 (patch)
tree694958029de8b97c03a8a907ff8a3f4c1e649846
parentd2f9814c62ee6904cdcbc66c03fdde3f476fa34b (diff)
libpyside: Add qobjectType() to return the Python type QObject
Set it directly instead of looking it up via converters, which is a step towards decoupling the converters from the per-interpreter types and saves dict lookups. Task-number: PYSIDE-3155 Change-Id: I31a71d1a9d02f1247e04c57de2c2901746221b4f Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r--sources/pyside6/PySide6/QtCore/typesystem_core_common.xml2
-rw-r--r--sources/pyside6/PySide6/glue/qtcore.cpp4
-rw-r--r--sources/pyside6/libpyside/pyside.cpp22
-rw-r--r--sources/pyside6/libpyside/pysideqobject.h7
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp2
-rw-r--r--sources/pyside6/libpysideqml/pysideqmlattached.cpp3
-rw-r--r--sources/pyside6/libpysideqml/pysideqmlextended.cpp3
-rw-r--r--sources/pyside6/libpysideqml/pysideqmllistproperty.cpp18
-rw-r--r--sources/pyside6/libpysideqml/pysideqmlregistertype.cpp13
-rw-r--r--sources/pyside6/libpysideqml/pysideqmlregistertype_p.h3
-rw-r--r--sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp13
11 files changed, 49 insertions, 41 deletions
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
index f4354f814..efddc9085 100644
--- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
+++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml
@@ -1830,6 +1830,8 @@
</extra-includes>
<inject-code class="native" position="beginning" file="../glue/qtcore.cpp"
snippet="core-snippets-p-h"/>
+ <inject-code class="target" position="end" file="../glue/qtcore.cpp"
+ snippet="libpyside-set-qobject-type"/>
<modify-function signature="metaObject()const">
<inject-code class="target" position="beginning" file="../glue/qtcore.cpp" snippet="qobject-metaobject"/>
<modify-argument index="return">
diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp
index 7fe6e9902..51549f6b1 100644
--- a/sources/pyside6/PySide6/glue/qtcore.cpp
+++ b/sources/pyside6/PySide6/glue/qtcore.cpp
@@ -15,6 +15,10 @@
#include "glue/core_snippets_p.h"
// @snippet core-snippets-p-h
+// @snippet libpyside-set-qobject-type
+PySide::setQObjectType(pyType);
+// @snippet libpyside-set-qobject-type
+
// @snippet qarg_helper
// Helper for the Q_ARG/Q_RETURN_ARG functions, creating a meta type
diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp
index 4030673a5..ca467c6c1 100644
--- a/sources/pyside6/libpyside/pyside.cpp
+++ b/sources/pyside6/libpyside/pyside.cpp
@@ -436,7 +436,7 @@ void destroyQCoreApplication()
Shiboken::BindingManager &bm = Shiboken::BindingManager::instance();
SbkObject *pyQApp = bm.retrieveWrapper(app);
- PyTypeObject *pyQObjectType = Shiboken::Conversions::getPythonTypeObject("QObject*");
+ PyTypeObject *pyQObjectType = PySide::qObjectType();
assert(pyQObjectType);
void *data[2] = {pyQApp, pyQObjectType};
@@ -507,7 +507,7 @@ const QMetaObject *retrieveMetaObject(PyObject *pyObj)
void initQObjectSubType(PyTypeObject *type, PyObject *args, PyObject * /* kwds */)
{
- PyTypeObject *qObjType = Shiboken::Conversions::getPythonTypeObject("QObject*");
+ PyTypeObject *qObjType = PySide::qObjectType();
PyObject *bases = PyTuple_GetItem(args, 1);
@@ -1020,18 +1020,26 @@ bool registerInternalQtConf()
return isRegistered;
}
-static PyTypeObject *qobjectType()
+static PyTypeObject *qObjType = nullptr;
+
+PyTypeObject *qObjectType()
{
- static PyTypeObject * const result = Shiboken::Conversions::getPythonTypeObject("QObject*");
+ PyTypeObject *result = qObjType;
+ Q_ASSERT(result);
return result;
}
+void setQObjectType(PyTypeObject *t)
+{
+ qObjType = t;
+}
+
bool isQObjectDerived(PyTypeObject *pyType, bool raiseError)
{
- const bool result = PyType_IsSubtype(pyType, qobjectType());
+ const bool result = PyType_IsSubtype(pyType, qObjectType());
if (!result && raiseError) {
PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.",
- qobjectType()->tp_name, pyType->tp_name);
+ qObjectType()->tp_name, pyType->tp_name);
}
return result;
}
@@ -1048,7 +1056,7 @@ QObject *convertToQObject(PyObject *object, bool raiseError)
return nullptr;
auto *sbkObject = reinterpret_cast<SbkObject*>(object);
- auto *ptr = Shiboken::Object::cppPointer(sbkObject, qobjectType());
+ auto *ptr = Shiboken::Object::cppPointer(sbkObject, qObjectType());
if (ptr == nullptr) {
if (raiseError) {
PyErr_Format(PyExc_TypeError, "Conversion of %s to QObject failed.",
diff --git a/sources/pyside6/libpyside/pysideqobject.h b/sources/pyside6/libpyside/pysideqobject.h
index 41762b009..a6248ef6c 100644
--- a/sources/pyside6/libpyside/pysideqobject.h
+++ b/sources/pyside6/libpyside/pysideqobject.h
@@ -19,6 +19,13 @@ QT_FORWARD_DECLARE_CLASS(QMutex)
namespace PySide
{
+/// Return PyTypeObject for QObject
+/// \return type object
+PYSIDE_API PyTypeObject *qObjectType();
+
+/// Set the PyTypeObject for QObject to \a t (called from QtCore module).
+PYSIDE_API void setQObjectType(PyTypeObject *t);
+
/// Fill QObject properties and do signal connections using the values found in \p kwds dictionary.
/// \param qObj PyObject fot the QObject.
/// \param metaObj QMetaObject of \p qObj.
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp
index 16a7c9c29..659e3fa62 100644
--- a/sources/pyside6/libpyside/pysidesignal.cpp
+++ b/sources/pyside6/libpyside/pysidesignal.cpp
@@ -1083,7 +1083,7 @@ static void instanceInitialize(PySideSignalInstance *self, PyObject *name,
PySideSignalInstance *initialize(PySideSignal *self, PyObject *name, PyObject *object)
{
- static PyTypeObject *pyQObjectType = Shiboken::Conversions::getPythonTypeObject("QObject*");
+ PyTypeObject *pyQObjectType = PySide::qObjectType();
assert(pyQObjectType);
if (!PyObject_TypeCheck(object, pyQObjectType)) {
diff --git a/sources/pyside6/libpysideqml/pysideqmlattached.cpp b/sources/pyside6/libpysideqml/pysideqmlattached.cpp
index e4e9c16dd..c0c6843b8 100644
--- a/sources/pyside6/libpysideqml/pysideqmlattached.cpp
+++ b/sources/pyside6/libpysideqml/pysideqmlattached.cpp
@@ -7,6 +7,7 @@
#include "pysideqmlregistertype_p.h"
#include <signalmanager.h>
+#include <pysideqobject.h>
#include <pyside_p.h>
#include <pysideclassdecorator_p.h>
@@ -106,7 +107,7 @@ static QObject *attachedFactoryHelper(PyTypeObject *attachingType, QObject *o)
return nullptr;
}
- if (PyType_IsSubtype(pyResult->ob_type, qObjectType()) == 0) {
+ if (PyType_IsSubtype(pyResult->ob_type, PySide::qObjectType()) == 0) {
qWarning("QmlAttached: Attached objects must inherit QObject, got %s.",
PepType_GetFullyQualifiedNameStr(Py_TYPE(pyResult)));
return nullptr;
diff --git a/sources/pyside6/libpysideqml/pysideqmlextended.cpp b/sources/pyside6/libpysideqml/pysideqmlextended.cpp
index f26fb9f89..cf08c1889 100644
--- a/sources/pyside6/libpysideqml/pysideqmlextended.cpp
+++ b/sources/pyside6/libpysideqml/pysideqmlextended.cpp
@@ -7,6 +7,7 @@
#include <pyside_p.h>
#include <pysideclassdecorator_p.h>
+#include <pysideqobject.h>
#include <autodecref.h>
#include <gilstate.h>
@@ -110,7 +111,7 @@ static QObject *extensionFactory(QObject *o)
return nullptr;
}
- if (PyType_IsSubtype(pyResult->ob_type, qObjectType()) == 0) {
+ if (PyType_IsSubtype(pyResult->ob_type, PySide::qObjectType()) == 0) {
qWarning("QmlExtended: Extension objects must inherit QObject, got %s.",
PepType_GetFullyQualifiedNameStr(pyResult->ob_type));
return nullptr;
diff --git a/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp b/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp
index a48a3d4de..91bfaf044 100644
--- a/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp
+++ b/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp
@@ -15,6 +15,7 @@
#include <pysideproperty.h>
#include <pysideproperty_p.h>
+#include <pysideqobject.h>
#include <QtCore/qobject.h>
#include <QtQml/qqmllist.h>
@@ -84,7 +85,7 @@ static int propListTpInit(PyObject *self, PyObject *args, PyObject *kwds)
else
data->doc.clear();
- PyTypeObject *qobjectType = qObjectType();
+ PyTypeObject *qobjectType = PySide::qObjectType();
if (!PySequence_Contains(data->type->tp_mro, reinterpret_cast<PyObject *>(qobjectType))) {
PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.",
@@ -143,7 +144,7 @@ void propListAppender(QQmlListProperty<QObject> *propList, QObject *item)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(2));
- PyTypeObject *qobjectType = qObjectType();
+ PyTypeObject *qobjectType = PySide::qObjectType();
PyTuple_SetItem(args, 0,
Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
PyTuple_SetItem(args, 1,
@@ -162,8 +163,9 @@ qsizetype propListCount(QQmlListProperty<QObject> *propList)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(1));
+ auto *qobjType = PySide::qObjectType();
PyTuple_SetItem(args, 0,
- Shiboken::Conversions::pointerToPython(qObjectType(), propList->object));
+ Shiboken::Conversions::pointerToPython(qobjType, propList->object));
auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->count, args));
@@ -187,7 +189,7 @@ QObject *propListAt(QQmlListProperty<QObject> *propList, qsizetype index)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(2));
- PyTypeObject *qobjectType = qObjectType();
+ PyTypeObject *qobjectType = PySide::qObjectType();
PyTuple_SetItem(args, 0,
Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
auto *converter = Shiboken::Conversions::PrimitiveTypeConverter<qsizetype>();
@@ -211,7 +213,7 @@ void propListClear(QQmlListProperty<QObject> * propList)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(1));
- PyTypeObject *qobjectType = qObjectType();
+ PyTypeObject *qobjectType = PySide::qObjectType();
PyTuple_SetItem(args, 0,
Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
@@ -228,7 +230,7 @@ void propListReplace(QQmlListProperty<QObject> *propList, qsizetype index, QObje
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(3));
- PyTypeObject *qobjectType = qObjectType();
+ PyTypeObject *qobjectType = PySide::qObjectType();
PyTuple_SetItem(args, 0,
Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
auto *converter = Shiboken::Conversions::PrimitiveTypeConverter<qsizetype>();
@@ -250,7 +252,7 @@ void propListRemoveLast(QQmlListProperty<QObject> *propList)
Shiboken::GilState state;
Shiboken::AutoDecRef args(PyTuple_New(1));
- PyTypeObject *qobjectType = qObjectType();
+ PyTypeObject *qobjectType = PySide::qObjectType();
PyTuple_SetItem(args, 0,
Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
@@ -268,7 +270,7 @@ void QmlListPropertyPrivate::metaCall(PyObject *source, QMetaObject::Call call,
return;
QObject *qobj{};
- PyTypeObject *qobjectType = qObjectType();
+ PyTypeObject *qobjectType = PySide::qObjectType();
Shiboken::Conversions::pythonToCppPointer(qobjectType, source, &qobj);
QQmlListProperty<QObject> declProp(
qobj, this,
diff --git a/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp b/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp
index 7e93fb11e..003e1e1f8 100644
--- a/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp
+++ b/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp
@@ -51,14 +51,6 @@ static void createInto(void *memory, void *type)
PySide::setNextQObjectMemoryAddr(nullptr);
}
-PyTypeObject *qObjectType()
-{
- static PyTypeObject *const result =
- Shiboken::Conversions::getPythonTypeObject("QObject*");
- assert(result);
- return result;
-}
-
static PyTypeObject *qQmlEngineType()
{
static PyTypeObject *const result =
@@ -403,13 +395,14 @@ QObject *SingletonQObjectCreationBase::handleReturnValue(PyObject *retVal)
PyErr_Format(PyExc_TypeError, "Callback returns 0 value.");
return nullptr;
}
- if (isPythonToCppPointerConvertible(qObjectType(), retVal) == nullptr) {
+ auto *qobjType = PySide::qObjectType();
+ if (isPythonToCppPointerConvertible(qobjType, retVal) == nullptr) {
PyErr_Format(PyExc_TypeError, "Callback returns invalid value (%S).", retVal);
return nullptr;
}
QObject *obj = nullptr;
- Shiboken::Conversions::pythonToCppPointer(qObjectType(), retVal, &obj);
+ Shiboken::Conversions::pythonToCppPointer(qobjType, retVal, &obj);
return obj;
}
diff --git a/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h b/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h
index 1f26d9c56..8545da931 100644
--- a/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h
+++ b/sources/pyside6/libpysideqml/pysideqmlregistertype_p.h
@@ -8,9 +8,6 @@
#include <QtCore/qbytearray.h>
-PyTypeObject *qObjectType();
-
-
namespace PySide::Qml {
PyObject *qmlNamedElementMacro(PyObject *pyObj, const QByteArray &typeName);
diff --git a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
index d0b2bfb96..30ea9a6d1 100644
--- a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
+++ b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
@@ -51,16 +51,9 @@ PyObject *propertiesAttr()
struct SourceDefs
{
- static PyTypeObject *getSbkType()
- {
- static PyTypeObject *sbkType =
- Shiboken::Conversions::getPythonTypeObject("QObject");
- return sbkType;
- }
-
static PyObject *getBases()
{
- static PyObject *bases = PyTuple_Pack(1, getSbkType());
+ static PyObject *bases = PyTuple_Pack(1, PySide::qObjectType());
return bases;
}
@@ -71,8 +64,8 @@ struct SourceDefs
static int tp_init(PyObject *self, PyObject *args, PyObject *kwds)
{
- static initproc initFunc = reinterpret_cast<initproc>(PyType_GetSlot(getSbkType(),
- Py_tp_init));
+ static initproc initFunc =
+ reinterpret_cast<initproc>(PyType_GetSlot(PySide::qObjectType(), Py_tp_init));
int res = initFunc(self, args, kwds);
if (res < 0) {
PyErr_Print();