void QObjectHandlerPrivate::onReadChannelFinished() { // Obtain the pointer to the socket emitting the signal QHttpSocket *socket = qobject_cast<QHttpSocket*>(sender()); // Obtain the index and remove it from the map int index = map.take(socket); // Actually invoke the slot invokeSlot(socket, index); }
// This is the universal slot itself that dispatches to the real slot. void PyQtProxy::unislot(void **qargs) { // If we are marked as disabled (possible if a queued signal has been // disconnected but there is still a signal in the event queue) then just // ignore the call. if (proxy_flags & PROXY_SLOT_DISABLED) return; // sender() must be called without the GIL to avoid possible deadlocks // between the GIL and Qt's internal thread data mutex. QObject *new_last_sender = sender(); SIP_BLOCK_THREADS QObject *saved_last_sender = last_sender; last_sender = new_last_sender; PyObject *res; // See if the sender was a short-circuit signal. */ if (last_sender && PyQtShortcircuitSignalProxy::shortcircuitSignal(last_sender)) { // The Python arguments will be the only argument. PyObject *pyargs = reinterpret_cast<PyQt_PyObject *>(qargs[1])->pyobject; res = sipInvokeSlot(&real_slot.sip_slot, pyargs); } else { proxy_flags |= PROXY_SLOT_INVOKED; res = invokeSlot(real_slot, qargs); proxy_flags &= ~PROXY_SLOT_INVOKED; // Self destruct if we are a single shot or disabled. if (proxy_flags & (SIP_SINGLE_SHOT|PROXY_SLOT_DISABLED)) { // See the comment in disable() for why we deleteLater(). deleteLater(); } } if (res) Py_DECREF(res); else PyErr_Print(); last_sender = saved_last_sender; SIP_UNBLOCK_THREADS }
void InvokeSlot::mainfunction() { invokeSlot(); }