0

自从我使用 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

4 回答 4

1

您可以使用 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
        }
    }
于 2009-01-13T10:52:49.800 回答
1

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

于 2009-03-13T21:52:19.560 回答
0

我不确切知道您要完成什么(或 MyClass 是什么以及它继承自什么基类),但连接到signal_toggled()可能比signal_activate()

于 2009-01-10T04:15:44.657 回答
0

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

于 2009-01-13T11:02:59.763 回答