diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-08-28 15:12:17 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-10-17 19:08:18 +0200 |
| commit | b21d14efdfa6730ed408e6e680e83185d62d631f (patch) | |
| tree | 0c5b8e1bcb233e5e2642deee5c5a4ce2dd7fe7b2 /sources/pyside6 | |
| parent | d099ba0fb651e91f3fa576599bf2c128adf0e847 (diff) | |
libpyside: Implement QMetaMethod::tags() for @Slot
Tags can be used like annotations and are for example
used in the DBus module.
[ChangeLog][PySide6] An optional parameter "tag" has been
added to @Slot, allowing to set QMetaMethod.tag().
Pick-to: 6.6
Fixes: PYSIDE-748
Change-Id: I62bef6179917307471cb72491ac3d05970572f3f
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6')
| -rw-r--r-- | sources/pyside6/doc/extras/QtCore.Slot.rst | 6 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/dynamicqmetaobject.cpp | 10 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysideslot.cpp | 14 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysideslot_p.h | 1 |
4 files changed, 23 insertions, 8 deletions
diff --git a/sources/pyside6/doc/extras/QtCore.Slot.rst b/sources/pyside6/doc/extras/QtCore.Slot.rst index 55c3d9fb7..c62104369 100644 --- a/sources/pyside6/doc/extras/QtCore.Slot.rst +++ b/sources/pyside6/doc/extras/QtCore.Slot.rst @@ -22,10 +22,11 @@ Detailed Description QtCore pyqtSlot Slot ======= ======================= ============= - .. class:: PySide6.QtCore.Slot([type1 [, type2...]] [, name="" [, result=None]]) + .. class:: PySide6.QtCore.Slot([type1 [, type2...]] [, name="" [, result=None, [tag=""]]]) :param name: str :param result: type + :param tag: str ``Slot`` takes a list of Python types of the arguments. @@ -34,6 +35,9 @@ Detailed Description The optional named argument ``result`` specifies the return type. + The optional named argument ``tag`` specifies a value to be returned + by ``QMetaMethod.tag()``. + .. seealso:: :ref:`signals-and-slots` Q_INVOKABLE diff --git a/sources/pyside6/libpyside/dynamicqmetaobject.cpp b/sources/pyside6/libpyside/dynamicqmetaobject.cpp index b7fbc7661..b41dbc275 100644 --- a/sources/pyside6/libpyside/dynamicqmetaobject.cpp +++ b/sources/pyside6/libpyside/dynamicqmetaobject.cpp @@ -53,7 +53,8 @@ public: const QByteArray &signature) const; int indexOfProperty(const QByteArray &name) const; int addSlot(const QByteArray &signature); - int addSlot(const QByteArray &signature, const QByteArray &type); + int addSlot(const QByteArray &signature, const QByteArray &type, + const QByteArray &tag = {}); int addSignal(const QByteArray &signature); void removeMethod(QMetaMethod::MethodType mtype, int index); int getPropertyNotifyId(PySideProperty *property) const; @@ -211,7 +212,8 @@ int MetaObjectBuilder::addSlot(const char *signature) } int MetaObjectBuilderPrivate::addSlot(const QByteArray &signature, - const QByteArray &type) + const QByteArray &type, + const QByteArray &tag) { if (!checkMethodSignature(signature)) return -1; @@ -219,6 +221,8 @@ int MetaObjectBuilderPrivate::addSlot(const QByteArray &signature, QMetaMethodBuilder methodBuilder = ensureBuilder()->addSlot(signature); if (!type.isEmpty() && type != "void"_ba) methodBuilder.setReturnType(type); + if (!tag.isEmpty()) + methodBuilder.setTag(tag); return m_baseObject->methodCount() + methodBuilder.index(); } @@ -638,7 +642,7 @@ void MetaObjectBuilderPrivate::parsePythonType(PyTypeObject *type) const auto *entryList = PySide::Slot::dataListFromCapsule(capsule); for (const auto &e : *entryList) { if (m_baseObject->indexOfSlot(e.signature) == -1) - addSlot(e.signature, e.resultType); + addSlot(e.signature, e.resultType, e.tag); } } } diff --git a/sources/pyside6/libpyside/pysideslot.cpp b/sources/pyside6/libpyside/pysideslot.cpp index 3954f5efa..676a0bb16 100644 --- a/sources/pyside6/libpyside/pysideslot.cpp +++ b/sources/pyside6/libpyside/pysideslot.cpp @@ -18,6 +18,7 @@ struct SlotData QByteArray name; QByteArray args; QByteArray resultType; + QByteArray tag; // QMetaMethod::tag() }; struct PySideSlot @@ -63,15 +64,17 @@ static PyTypeObject *PySideSlot_TypeF() int slotTpInit(PyObject *self, PyObject *args, PyObject *kw) { static PyObject *emptyTuple = nullptr; - static const char *kwlist[] = {"name", "result", nullptr}; + static const char *kwlist[] = {"name", "result", "tag", nullptr}; char *argName = nullptr; PyObject *argResult = nullptr; + char *tag = nullptr; if (emptyTuple == nullptr) emptyTuple = PyTuple_New(0); - if (!PyArg_ParseTupleAndKeywords(emptyTuple, kw, "|sO:QtCore.Slot", - const_cast<char **>(kwlist), &argName, &argResult)) { + if (!PyArg_ParseTupleAndKeywords(emptyTuple, kw, "|sOs:QtCore.Slot", + const_cast<char **>(kwlist), + &argName, &argResult, &tag)) { return -1; } @@ -93,6 +96,9 @@ int slotTpInit(PyObject *self, PyObject *args, PyObject *kw) if (argName) data->slotData->name = argName; + if (tag) + data->slotData->tag = tag; + data->slotData->resultType = argResult ? PySide::Signal::getTypeName(argResult) : PySide::Signal::voidType(); @@ -132,7 +138,7 @@ PyObject *slotCall(PyObject *self, PyObject *args, PyObject * /* kw */) Py_INCREF(capsule); PyObject_SetAttr(callback, pySlotName, capsule); } - entryList->append({signature, returnType}); + entryList->append({signature, returnType, data->slotData->tag}); //clear data delete data->slotData; diff --git a/sources/pyside6/libpyside/pysideslot_p.h b/sources/pyside6/libpyside/pysideslot_p.h index 8cebcd575..9852301ee 100644 --- a/sources/pyside6/libpyside/pysideslot_p.h +++ b/sources/pyside6/libpyside/pysideslot_p.h @@ -13,6 +13,7 @@ namespace PySide::Slot { struct Data { QByteArray signature; QByteArray resultType; + QByteArray tag; // QMetaMethod::tag() }; // This list is set as an attribute named PySide::PySideMagicName::slot_list_attr() |
