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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top