}
}
-void QQmlAbstractBoundSignal::addToObject()
+void QQmlAbstractBoundSignal::addToObject(QObject *obj)
{
Q_ASSERT(!m_prevSignal);
- QObject *obj = object();
Q_ASSERT(obj);
QQmlData *data = QQmlData::get(obj, true);
QQmlBoundSignal::QQmlBoundSignal(QObject *scope, const QMetaMethod &signal,
QObject *owner)
-: m_expression(0), m_signal(signal), m_paramsValid(false), m_isEvaluating(false), m_params(0), m_owner(owner)
+: m_expression(0), m_params(0), m_scope(scope), m_signal(signal), m_paramsValid(false), m_isEvaluating(false)
{
// This is thread safe. Although it may be updated by two threads, they
// will both set it to the same value - so the worst thing that can happen
// is that they both do the work to figure it out. Boo hoo.
if (evaluateIdx == -1) evaluateIdx = metaObject()->methodCount();
+ addToObject(owner);
+
QQmlPropertyPrivate::connect(scope, m_signal.methodIndex(), this, evaluateIdx);
}
if (scope == "Qt")
meta = &QObject::staticQtMetaObject;
else
- meta = static_cast<QQmlBoundSignal*>(parent)->object()->metaObject();
+ meta = static_cast<QQmlBoundSignal*>(parent)->scope()->metaObject();
for (int i = meta->enumeratorCount() - 1; i >= 0; --i) {
QMetaEnum m = meta->enumerator(i);
if ((m.name() == name) && (scope.isEmpty() || (m.scope() == scope))) {
virtual int index() const = 0;
virtual QQmlBoundSignalExpression *expression() const = 0;
virtual QQmlBoundSignalExpression *setExpression(QQmlBoundSignalExpression *) = 0;
- virtual QObject *object() = 0;
+ virtual QObject *scope() = 0;
- void addToObject();
+protected:
+ void addToObject(QObject *owner);
private:
friend class QQmlData;
QQmlBoundSignalExpression *expression() const;
QQmlBoundSignalExpression *setExpression(QQmlBoundSignalExpression *);
- QObject *object() { return m_owner; }
+ QObject *scope() { return m_scope; }
bool isEvaluating() const { return m_isEvaluating; }
private:
QQmlBoundSignalExpression *m_expression;
+ QQmlBoundSignalParameters *m_params;
+ QObject *m_scope;
QMetaMethod m_signal;
bool m_paramsValid : 1;
bool m_isEvaluating : 1;
- QQmlBoundSignalParameters *m_params;
- QObject *m_owner;
};
QT_END_NAMESPACE
if (expr) {
QQmlBoundSignal *signal = new QQmlBoundSignal(that.d->object, that.method(), that.d->object);
QQmlBoundSignalExpression *oldExpr = signal->setExpression(expr);
- signal->addToObject();
return oldExpr;
} else {
return 0;
QQmlBoundSignalExpression *expr =
new QQmlBoundSignalExpression(CTXT, context, DATAS.at(instr.value), true, COMP->name, instr.line, instr.column);
bs->setExpression(expr);
- bs->addToObject();
QML_END_INSTR(StoreSignal)
QML_BEGIN_INSTR(StoreImportedScript)
QQmlBoundSignalExpression *expression = ctxtdata ?
new QQmlBoundSignalExpression(ctxtdata, 0, script, true, location, line, column) : 0;
signal->setExpression(expression);
- signal->addToObject();
d->boundsignals += signal;
} else {
if (!d->ignoreUnknownSignals)