[solved] Dynamisches SIGNAL-SLOT Verknüpfen?
[solved] Dynamisches SIGNAL-SLOT Verknüpfen?
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
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
Zuletzt geändert von grid am 10. September 2008 22:31, insgesamt 1-mal geändert.
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
Falls Du es schaffst wäre ich auch an der Lösung interessiert.
Lg NoRulez
Lösung:
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 !
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)" );
http://doc.trolltech.com/4.3/qmetaobject.html
Qt gefällt mir immer mehr
Nochmals Danke für die schnellen Antworten !
Zuletzt geändert von grid am 10. September 2008 22:09, insgesamt 1-mal geändert.
oder gleich direkt
nichts anderes macht ja SIGNAL() und SLOT()... aber deine Lösung sieht auch nicht schlecht aus...
Code: Alles auswählen
QObject::connect( objA , "2neu(int,int)" , objB , "1ok(int,int)" );
Ich schaffe es einfach nicht QObject::connect komplett dynamisch, beispielsweise mit Variabeln anzusteuern.solarix hat geschrieben:oder gleich direktnichts anderes macht ja SIGNAL() und SLOT()... aber deine Lösung sieht auch nicht schlecht aus...Code: Alles auswählen
QObject::connect( objA , "neu(int,int)" , objB , "ok(int,int)" );
Zum Beispiel...
Code: Alles auswählen
const char* slot = "ok(int,int)";
const char* signal = "neu(int,int)";
QObject::connect( objA , signal , objB , slot );
Zuletzt geändert von grid am 10. September 2008 22:12, insgesamt 1-mal geändert.
Ok, das ist echt sehr hilfreich.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..
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!
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten: