2012-03-28 3 views
0

Ich versuche, ein Widget mit 9 Toggle-Tasten (3 Zeilen und 3 Spalten), der Benutzer in der Lage, eine von denen zu wählen. Also schrieb ich 9 Ereignishandler, die die aktuell ausgewählte Schaltfläche deaktiviert und die Auswahl gespeichert.Einzelhandler für 9 Tasten (gtkmm-2, libsigC++)

Ich wollte nur wissen, ob es eine Möglichkeit, zu verbinden diese 9 Umschaltflächen auf einen einzigen Handler ist, und wenn es eine Möglichkeit zu wissen, welche Taste das Signal ausgesendet. Etwas Ähnliches wie QTs

QObject::sender() 

Dies würde viel Wiederholung in meinem Code vermeiden. Wie im Titel erwähnt, verwende ich gtkmm Version 2 und natürlich sigC++.

Vielen Dank im Rat

Antwort

1

ich mit gtkmm nicht so vertraut bin, aber einfach in C GTK sieht die Signal-Handler wie folgt aus:

void on_button_toggled (GtkToggleButton *button, gpointer user_data); 

Der button Zeiger ist der 'Absender' in QT-Terminologie. Um herauszufinden, welcher Button welcher ist, können Sie ihn benennen oder Daten mit g_object_set_data() anhängen.

+1

button-> signal_clicked(). Connect (sigc :: bind (sigc :: mem_fun (* dies & MyWidget :: on_button_clicked), * button)); in Gtkmm – Ivarpoiss

1

Ich habe C++ 11 Lambdas verwendet, um ein ähnliches Problem zu lösen. Im Prinzip erfassen Sie die Informationen über das Ziel im Lambda. Wenn das Signal ausgelöst wird, können Sie etwas zielspezifisches tun. Zum Beispiel:

abutton.signal_clicked().connect([this,&abutton]{ handle_click(abutton); }); 

Ich glaube, dies mit gtkmm 2.x funktionieren wird, aber ich habe nur mit 3.0 und ich weiß nicht, wie sigC++ zwischen den beiden Versionen geändert hat. Wenn Sie die C++ 11-Funktionen nicht verwenden können, können Sie vielleicht etwas Ähnliches mit der Lambda-Funktion von sigC++ machen, aber ich habe keine Erfahrung damit.

+0

Ein anderer Weg ist gegeben durch @Ivarpoiss 'Kommentar zu Ptomatos Antwort und auch meine Antwort hier: http://StackOverflow.com/a/13613054/240633 – ergosys