[Kde-bindings] Qyoto: SIGNALS/SLOTS
Richard Dale
Richard_Dale at tipitina.demon.co.uk
Tue Dec 13 21:59:53 UTC 2005
On Tuesday 13 December 2005 21:06, Thomas Moenicke wrote:
> Richard Dale wrote:
> > > [SIGNAL]
> > > public void EmitStuff ()
> > > {
> > > Emit("EmitStuff()");
> > > }
>
> do you have to modify the language parser to provide this syntax? Or is it
> better to find an exception which can be intercepted? Or generally without
> additional syntax? I ask because I have to find a solution similary to
> this. I want to handover signals to an engine which calls the right php
> function defined by user.
The above is one of Adam's suggestions that Qt# used. Or this one has the
signal defined just as a type signature in an interface, which is transformed
into a method call by using a C# transparent proxy.
[Q_SIGNAL("EmitStuff()")]
public void EmitStuff();
...
((MyInterface) Emit()).EmitStuff()
In C++ a signal is transformed into from a type declaration to a method call
by the moc. So in other languages need to do something similar.
In qtruby a signal is defined like this:
class MyClass < Qt::Object
signals 'emitStuff()'
def foobar
emit emitStuff()
end
end
The "signals 'emitStuff()'" is a method call that is called when the ruby code
is parsed (a bit like C# Attributes are). I'm not sure if there is something
similar in php.
An emitStuff() method is added to the 'MyClass', which is then called by the
'emit emitStuff()' statement, and the QMetaObject created at runtime has a
corresponding signal entry. Then inside the dynamically added 'emitStuff()'
method, the ruby args are marshalled to C++ ones and QtMetaObject::activate()
is called.
In the C++ class EmitSignal in qtruby/rubylib/qtruby/Qt.cpp:
_obj->metaObject()->activate(_obj, _id, o);
Slots are invoked via qt_metacall() in Qt4 - I've been wrongly talking about
that instead of activate() for signal invocations.
-- Richard
More information about the Kde-bindings
mailing list