Seite 1 von 1
[solved] Dynamisches SIGNAL-SLOT Verknüpfen?
Verfasst: 10. September 2008 14:51
von grid
Hallo.
Ich habe z.B. zwei Listen.
In der einen stehen Signale eines Objektes in der anderen die Slots eines anderen Objekts. Nun möchte ich dem Benutzer die Möglichkeit geben je nach belieben passende Signale und Slots zu kombinieren und diese dynamisch und zur Laufzeit zu verknüpfen, oder Verknüpfungen wieder aufzuheben.
Gibt es ein WorkAround für sowas ohne für jede erdenkliche Singal-Slot-Kombination eine eigene Funktion zu schreiben?
Ich komme von der Java-Swing Programierung und bin mit Qt und C++ noch nicht großartig bewandert^^
danke und beste Grüße
grid
Verfasst: 10. September 2008 17:12
von upsala
Wozu will man soetwas machen?
Ansonsten: Mal das QMetaObject deines QObject's anschaun...
Verfasst: 10. September 2008 18:33
von NoRulez
Da fällt mir spontan nur QtScript ein (
http://labs.trolltech.com/blogs/2007/01 ... -qtscript/).
Falls Du es schaffst wäre ich auch an der Lösung interessiert.
Lg NoRulez
Verfasst: 10. September 2008 21:06
von solarix
Vielleicht verstehe ich das Problem nicht.. aber alle (!) Signal-Slot-Verknüpfungen sind dynamisch.. Warum soll QObject::connect und QObject::disconnect _nicht_ gehen?
Verfasst: 10. September 2008 21:39
von grid
Lösung:
Code: Alles auswählen
void connectOnRuntime( QObject* a , const char* methodA , QObject* b , const char* methodB){
int signalId = b->metaObject()->indexOfSignal( methodA );
int slotId = a->metaObject()->indexOfSlot( methodB );
QMetaObject::connect( a , signalId , b , slotId );
}
connectOnRuntime( objA , "neu(int,int)" , objB , "ok(int,int)" );
Und die MetaObjekte können noch mehr. Es ist möglich alle Slots, Signals und Funktionen eines Objektes auszulesen und einfach aufzulisten.
http://doc.trolltech.com/4.3/qmetaobject.html
Qt gefällt mir immer mehr
Nochmals Danke für die schnellen Antworten !
Verfasst: 10. September 2008 21:59
von solarix
oder gleich direkt
Code: Alles auswählen
QObject::connect( objA , "2neu(int,int)" , objB , "1ok(int,int)" );
nichts anderes macht ja SIGNAL() und SLOT()... aber deine Lösung sieht auch nicht schlecht aus...
Verfasst: 10. September 2008 22:08
von grid
solarix hat geschrieben:oder gleich direkt
Code: Alles auswählen
QObject::connect( objA , "neu(int,int)" , objB , "ok(int,int)" );
nichts anderes macht ja SIGNAL() und SLOT()... aber deine Lösung sieht auch nicht schlecht aus...
Ich schaffe es einfach nicht QObject::connect komplett dynamisch, beispielsweise mit Variabeln anzusteuern.
Zum Beispiel...
Code: Alles auswählen
const char* slot = "ok(int,int)";
const char* signal = "neu(int,int)";
QObject::connect( objA , signal , objB , slot );
...funktioniert bei mir nicht.
Verfasst: 10. September 2008 22:11
von solarix
du hast mein Zitat umgeschrieben.. da hast du was rausgelöscht.. und genau darum funktioniert es nicht

Verfasst: 10. September 2008 22:13
von grid
solarix hat geschrieben:du hast mein Zitat umgeschrieben.. da hast du was rausgelöscht.. und genau darum funktioniert es nicht

Achso^^ und ich dachte es liegt am Wetter
Also die 2 am Anfang signalisiert wirklich der connect Methode dass es sich um ein Signal handelt?
Verfasst: 10. September 2008 22:21
von solarix
... und "1" ein slot... da hat's nicht mehr Magic dahinter

.. kannst es dir ja im Qt-Source anschauen.. SIGNAL() und SLOT() sind ja nur Makros..
Verfasst: 10. September 2008 22:25
von grid
solarix hat geschrieben:... und "1" ein slot... da hat's nicht mehr Magic dahinter

.. kannst es dir ja im Qt-Source anschauen.. SIGNAL() und SLOT() sind ja nur Makros..
Ok, das ist echt sehr hilfreich.
Wie gesagt, C++ und Qt sind erst seit ca. einer Woche mein neues Spielzeug^^
Dann wird das wohl meine Lösung werden:
Code: Alles auswählen
const char* slot = "1ok(int,int)";
const char* signal = "2neu(int,int)";
QObject::connect( objA , signal , objB , slot );
Vielen Dank nochmals!
Verfasst: 10. September 2008 22:36
von Christian81
Und was soll da der unterschied zu QObject::connect( objA , SIGNAL(ok(int,int)), objB , SLOT(neu(int,int)) ); ??