English 中文(简体)
来自gtkmm弹出列表的两个信号火。
原标题:
  • 时间:2009-01-06 23:21:17
  •  标签:

我已经有一段时间没有使用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 被调用两次。当已选择的单选按钮被点击时,它只被调用一次。

我猜第一次触发是为了表示“某事不再激活”,第二次是为了新的单选按钮激活。无论我是正确还是错误,问题都是一样的:我该如何让我的处理程序每次只执行一次操作?要么我需要处理程序只被调用一次,要么我需要从内部检查某些内容,以知道回调是否是“重复”的。

最佳回答

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

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

然后您可以在回调中使用item->get_active()来仅响应激活。

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

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

我不确定你究竟想要达到什么目的(或者MyClass是什么以及它从哪些基类继承而来),但连接到signal_toggled()可能比连接到signal_activate()更有用。

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





相关问题
热门标签