信号从gtkmm弹出列表中触发两次

时间:2009-01-06 23:21:18

标签: gtk signals gtkmm

自从我使用GTK +以来已经有一段时间了,我上次使用的是C语言,而不是像现在这样使用gtkmm和C ++。无论如何,我认为应该是一个容易解决的问题:

我有一个弹出式菜单,其中包含一个单选按钮列表,当我单击其中一个按钮时,我想要进行一些操作。代码如下:

    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) );
    }

我看到的唯一问题是,当从菜单中选择以前未选中的单选按钮时,MyClass::on_item_activated会被调用两次。单击已经选中的单选按钮时,只调用一次。

我猜第一次射击就是说“某些东西不再激活”,第二次是激活新的单选按钮。无论我是对还是错,问题都是一样的:我如何才能让我的处理程序每​​次点击只采取一次行动?我要么只需要一次调用处理程序,或者我需要从里面检查一些东西来知道回调是否是“重复”。

4 个答案:

答案 0 :(得分:1)

您可以使用sigc :: bind将该项作为参数提供给回调函数。

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

然后你可以在回调中使用item-&gt; get_active()来响应激活。

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

答案 1 :(得分:1)

这也是我所做的,连接到signal_toggled()并检查get_active()是否为真。

答案 2 :(得分:0)

我不确切地知道你要完成什么(或者MyClass是什么以及它继承了哪些基类),但是连接到signal_toggled()可能比signal_activate()更有用

答案 3 :(得分:0)

/同意约翰内斯。接收信号时检查项目是否已激活。