Cela fait un moment que j'ai utilisé GTK +, et la dernière fois que je l'ai fait était en C, n'utilisant pas gtkmm et C++ comme je le suis maintenant. Quoi qu'il en soit, j'ai ce que je pense devrait être un problème facile à résoudre:Le signal se déclenche deux fois depuis la liste déroulante gtkmm
J'ai un menu contextuel consistant en une liste de boutons radio, et quand je clique sur l'un d'entre eux je veux que quelque chose se produise. Le code va comme ceci:
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));
}
Le seul problème que je vois est que MyClass::on_item_activated
est appelé deux fois quand un bouton radio précédemment désélectionné est choisi dans le menu. Il est appelé une seule fois lorsque le bouton radio déjà sélectionné est cliqué.
Je suppose que le premier tir est de dire "quelque chose n'est plus activé", et le second est pour le nouveau bouton d'activation radio. Que je me trompe ou que je me trompe, la question est la même: comment puis-je faire en sorte que mon gestionnaire n'agisse qu'une fois par clic? Soit j'ai besoin du gestionnaire pour être appelé une seule fois, soit j'ai besoin de quelque chose pour vérifier de l'intérieur pour savoir si le rappel est un "doublon" ou non.
N'a pas encore essayé mais cela semble être la meilleure approche. –
Mais comment pouvez-vous garantir que pItem sera toujours valide au moment de ce rappel? J'ai essayé cette approche et mon application s'est écrasée. pItem a été retourné à partir d'un objet Builder Glade ... –