代码之家  ›  专栏  ›  技术社区  ›  John Zwinck

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

  •  0
  • John Zwinck  · 技术社区  · 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 在从菜单中选择以前未选中的单选按钮时调用两次。单击已选择的单选按钮时,仅调用一次。

    我猜第一个触发是说“某些东西不再激活”,第二个触发是新的单选按钮激活。无论我是对是错,问题都是一样的:我如何最好地让我的处理程序每次单击只执行一次操作?要么我需要处理程序只被调用一次,要么我需要一些东西从内部检查回调是否是“重复的”。

    4 回复  |  直到 11 年前
        1
  •  1
  •   Johannes Johannes    17 年前

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

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

    然后您可以使用项目->在回调中获取_active()以仅响应激活。

          void MyClass::on_item_activated(Gtk::RadioMenuItem* item) {
            if (item->get_active()) {
                   // Do some stuff
            }
        }
    
        2
  •  1
  •   rahularyansharma    17 年前

    我也是这么做的,连接到 signal_toggled() get_active() 这是真的。

        3
  •  0
  •   jonner    17 年前

    我不知道你到底想完成什么(或者MyClass是什么,它继承了什么基类),但是连接到 signal_toggled() 可能比 signal_activate()

        4
  •  0
  •   RvdK    17 年前

    推荐文章