// Find an overload that matches a subscript. int qpycore_signal_index(qpycore_pyqtSignal *ps, PyObject *subscript, const char *context) { // Make sure the subscript is a tuple. PyObject *args; if (PyTuple_Check(subscript)) { args = subscript; } else { args = PyTuple_New(1); if (!args) return -1; PyTuple_SET_ITEM(args, 0, subscript); } Py_INCREF(subscript); // Parse the subscript as a tuple of types. Chimera::Signature *ss_signature = Chimera::parse(args, 0, context); Py_DECREF(args); if (!ss_signature) return -1; // Search for an overload with this signature. int idx = -1; for (int i = 0; i < ps->overloads->size(); ++i) { Chimera::Signature *oload = ps->overloads->at(i); if (oload->arguments() == ss_signature->signature) { idx = i; break; } } delete ss_signature; if (idx < 0) { PyErr_SetString(PyExc_KeyError, "there is no matching overloaded signal"); return -1; } return idx; }
void qpycore_qmetaobject_connectslotsbyname(QObject *qobj, PyObject *qobj_wrapper) { // Get the class attributes. PyObject *dir = PyObject_Dir((PyObject *)Py_TYPE(qobj_wrapper)); if (!dir) return; PyObject *slot_obj = 0; for (SIP_SSIZE_T li = 0; li < PyList_GET_SIZE(dir); ++li) { PyObject *name_obj = PyList_GET_ITEM(dir, li); // Get the slot object. Py_XDECREF(slot_obj); slot_obj = PyObject_GetAttr(qobj_wrapper, name_obj); if (!slot_obj) continue; // Ignore it if it is not a callable. if (!PyCallable_Check(slot_obj)) continue; // Use the signature attribute instead of the name if there is one. PyObject *sigattr = PyObject_GetAttr(slot_obj, qpycore_dunder_pyqtsignature); if (sigattr) { for (SIP_SSIZE_T i = 0; i < PyList_GET_SIZE(sigattr); ++i) { PyObject *decoration = PyList_GET_ITEM(sigattr, i); Chimera::Signature *sig = Chimera::Signature::fromPyObject(decoration); QByteArray args = sig->arguments(); if (!args.isEmpty()) connect(qobj, slot_obj, sig->name(), args); } Py_DECREF(sigattr); } else { const char *ascii_name = sipString_AsASCIIString(&name_obj); if (!ascii_name) continue; PyErr_Clear(); connect(qobj, slot_obj, QByteArray(ascii_name), QByteArray()); Py_DECREF(name_obj); } } Py_XDECREF(slot_obj); Py_DECREF(dir); }