GTK+ を使用してからしばらく経ちましたが、最後に使用したのは C で、現在のように gtkmm と C++ は使用していません。とにかく、私は解決するのが簡単な問題だと思うものを持っています:
ラジオ ボタンのリストで構成されるポップアップ メニューがあり、そのうちの 1 つをクリックすると何らかのアクションが発生するようにしたいと考えています。コードは次のようになります。
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
、以前に選択されていないラジオボタンがメニューから選択されたときに2回呼び出されることです。すでに選択されているラジオボタンがクリックされたときに一度だけ呼び出されます。
最初の発火は「何かがアクティブではなくなった」ということで、2 回目は新しいラジオ ボタンのアクティブ化のためだと思います。私が正しいか間違っているかにかかわらず、質問は同じです。クリックごとに 1 回だけハンドラーにアクションを実行させるにはどうすればよいでしょうか? ハンドラーを一度だけ呼び出す必要があるか、コールバックが「重複」しているかどうかを確認するために内部からチェックするものが必要です。