Frage

Es ist schon eine Weile her, seit ich GTK + verwendet, und das letzte Mal, dass ich in C tat, war, nicht mit gtkmm und C ++, wie ich jetzt bin. Wie auch immer, ich habe, was ich denke, soll ein einfaches Problem zu lösen sein:

Ich habe ein Pop-up-Menü aus einer Liste von Radiobuttons aus, und wenn ich einen von ihnen klicken mag ich einige Aktion erfolgen kann. Der Code lautet wie folgt:

    Gtk::RadioMenuItem::Group group;
    for ( size_t i = 1; i < LH_MAX; ++i )
    {
        Gtk::RadioMenuItem* pItem = new Gtk::RadioMenuItem( group, names[i], names[i] );
        pItem->set_name( names[i] );
        pItem->signal_activate().connect( sigc::mem_fun(*this, &MyClass::on_item_activated) );
        pItem->show();
        m_Menu.append( *Gtk::manage(pItem) );
    }

Das einzige Problem, das ich sehe ist, dass MyClass::on_item_activated zweimal aufgerufen wird, wenn ein vorher nicht ausgewähltes Optionsfeld aus dem Menü ausgewählt wird. Es ist nur ein einziges Mal aufgerufen, wenn der bereits ausgewählte Radiobutton geklickt wird.

Ich vermute, dass das erste Brennen zu sagen, „etwas ist nicht mehr aktivieren“, und die zweite ist für den neuen Radiobutton-Aktivierung. Ob ich richtig oder falsch bin, ist die Frage gleich: wie sie am besten kann ich meine Handler nur Maßnahmen ergreifen, einmal pro Klick? Entweder ich brauche den Handler nur einmal aufgerufen werden, oder ich brauche etwas zu überprüfen von innen, es zu wissen, ob der Rückruf ein „doppelte“ ist oder nicht.

War es hilfreich?

Lösung

könnten Sie verwenden sigc :: bind das Element als Argument an die Callback-Funktion zu liefern.

pItem->signal_activate().sigc::bind(sigc::mem_fun(*this,&MyClass::on_item_activated),pItem));

Dann können Sie item- verwenden> get_active () in dem Rückruf nur Aktivierungen zu reagieren.

      void MyClass::on_item_activated(Gtk::RadioMenuItem* item) {
        if (item->get_active()) {
               // Do some stuff
        }
    }

Andere Tipps

Das ist, was ich zu tun, eine Verbindung zu signal_toggled() und prüfen, ob get_active() wahr ist.

Ich weiß nicht genau, was Sie erreichen wollen (oder was MyClass ist und welche Basisklassen aus erbt), sondern auf signal_toggled() verbinden könnte nützlicher sein als signal_activate()

/ Vereinbaren Sie mit Johannes. Überprüfen Sie, ob das Element aktiviert wird, wenn das Signal empfangen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top