0

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 回だけハンドラーにアクションを実行させるにはどうすればよいでしょうか? ハンドラーを一度だけ呼び出す必要があるか、コールバックが「重複」しているかどうかを確認するために内部からチェックするものが必要です。

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 に答える