Sinal dispara duas vezes na lista pop-up gtkmm
Pergunta
Tem sido um tempo desde que eu usei GTK +, e a última vez que fiz foi em C, não usando gtkmm e C ++ como estou agora. De qualquer forma, eu tenho o que eu acho que deve ser um problema fácil de resolver:
Eu tenho um menu pop-up consiste em uma lista de botões de rádio, e quando clico em um deles eu quero alguma ação ocorra. O código é assim:
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) );
}
O único problema que vejo é que MyClass::on_item_activated
é chamado duas vezes quando um botão de opção previamente não selecionado é escolhido no menu. É chamado apenas uma vez quando o botão de opção já selecionada é clicado.
Eu estou supondo que o primeiro disparo é para dizer "alguma coisa já não é ativar", eo segundo é para a nova ativação do botão de rádio. Se estou certo ou errado, a questão é a mesma: como melhor eu posso ter meu manipulador só pode tomar medidas uma vez por clique? Ou eu preciso o manipulador de ser chamado apenas uma vez, ou eu preciso de alguma coisa para verificar de dentro dele para saber se o retorno de chamada é um "duplicado" ou não.
Solução
Você pode usar SIGC :: bind para fornecer o item como um argumento para a função de retorno de chamada.
pItem->signal_activate().sigc::bind(sigc::mem_fun(*this,&MyClass::on_item_activated),pItem));
Então você pode usar item-> get_active () no retorno para responder às ativações somente.
void MyClass::on_item_activated(Gtk::RadioMenuItem* item) {
if (item->get_active()) {
// Do some stuff
}
}
Outras dicas
Isso é o que eu faço também, conectar a signal_toggled()
e verificar se get_active()
é verdade.
Eu não sei exatamente o que você está tentando realizar (ou o que MyClass é eo que base de aulas que herda), mas a conexão com signal_toggled()
pode ser mais útil do que signal_activate()
/ Concordo com Johannes. Verifique se o item é ativado quando receber o sinal.