bool QtBoostIntegrationBindingObject::bind(QObject *sender, const char *signal,
                         QObject *receiver, QtBoostAbstractConnectionAdapter *adapter,
#ifdef QTBOOSTINTEGRATION_CHECK_SIGNATURE
                         int nrArguments, int argumentList[],
#endif
                         Qt::ConnectionType connType)
{
    if (!sender || !signal || !adapter)
        return false;

    int signalIndex = sender->metaObject()->indexOfSignal(&signal[1]);
    if (signalIndex < 0) {
        qWarning("qtlambda::connect(): no match for signal '%s'", signal);
        return false;
    }

    Q_ASSERT_X(!receiver || receiver->thread() == thread(),
               "qtlambda::connect", "The receiving QObject must be on the thread connect() is called in");

#ifdef QTBOOSTINTEGRATION_CHECK_SIGNATURE
    QByteArray signalSignature = sender->metaObject()->normalizedSignature(signal);
    QByteArray adapterSignature = buildAdapterSignature(nrArguments, argumentList);

    if (!QMetaObject::checkConnectArgs(signalSignature, adapterSignature))
        return false;
#endif

    // locate a free slot
    int slotIndex = m_freeList.isEmpty() ? m_bindings.size() : m_freeList.takeLast();

    // wire up the connection from the binding object to the sender
    bool connected = QMetaObject::connect(sender, signalIndex, this, slotIndex + bindingOffset(), connType);
    if (!connected)
        return false;

    // store the binding
    if (slotIndex == m_bindings.size())
        m_bindings.append(Binding(sender, signalIndex, receiver, adapter));
    else
        m_bindings[slotIndex] = Binding(sender, signalIndex, receiver, adapter);

    auto sender_d = getObjectData(sender, true);
    auto receiver_d = (receiver && receiver != sender) ? getObjectData(receiver, true) : 0;
    Q_ASSERT(sender_d);
    BindingList::add(sender_d->receivers, slotIndex);
    if (receiver_d) {
        BindingList::add(receiver_d->senders, slotIndex);

        // make the sender and the receiver aware of each other
        receiver_d->senders->other = sender_d->receivers;
        sender_d->receivers->other = receiver_d->senders;
    }

    static_cast<ConnectNotifyObject *>(sender)->callConnectNotify(signal);
    return true;
}
Ejemplo n.º 2
0
ObjectData *Variant::getArrayAccess() const {
  assert(is(KindOfObject));
  ObjectData *obj = getObjectData();
  assert(obj);
  if (!obj->instanceof(SystemLib::s_ArrayAccessClass)) {
    throw InvalidOperandException("not ArrayAccess objects");
  }
  return obj;
}
Ejemplo n.º 3
0
vector<double> objectFileReader::getOrbitParamsDot(QString object, bool *ok)
{
    vector<double> vec;
    QJsonObject obj;
    vec.push_back(0.0f);
    obj = getObjectData(object,ok);
    qDebug()<< obj.keys();
    return vec;
}
bool QtBoostIntegrationBindingObject::unbind(QObject *sender, const char *signal, QObject *receiver)
{
    bool found = false;
    if (sender) {
        int signalIndex = -1;
        if (signal) {
            signalIndex = sender->metaObject()->indexOfSignal(&signal[1]);
            if (signalIndex < 0)
                return false;
        }

        auto sender_d = getObjectData(sender);
        unbindHelper(sender_d->receivers, [=, &found](const Binding &b, int i) {
            if ((b.signalIndex == signalIndex || signalIndex == -1) &&
                (b.receiver == receiver || !receiver))
            {
                found = true;
                QMetaObject::disconnectOne(b.sender, b.signalIndex, this, i + bindingOffset());
                callDisconnectNotify(b);
                return true;
            } else {
                return false;
            }
        });
    } else {
        Q_ASSERT(receiver);
        auto receiver_d = getObjectData(receiver);
        if (receiver_d->senders)
            found = true;
        unbindHelper(receiver_d->senders, [=](const Binding &b, int i) {
            QMetaObject::disconnectOne(b.sender, b.signalIndex, this, i + bindingOffset());
            callDisconnectNotify(b);
            return true;
        });
    }

    return found;
}