質問

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回呼び出されることです。既に選択されているラジオボタンがクリックされたときに1回だけ呼び出されます。

最初の発砲は「何かがアクティブにならない」と言うことだと推測しています。 2つ目は、新しいラジオボタンの有効化です。私が正しいか間違っているかに関わらず、質問は同じです:ハンドラーがクリックごとに1回だけアクションを起こすようにするにはどうすればいいですか?ハンドラーが1回だけ呼び出されるようにする必要があるか、コールバックが「複製」であるかどうかを知るためにハンドラー内から何かを確認する必要があります。かどうか。

役に立ちましたか?

解決

sigc :: bindを使用して、コールバック関数への引数としてアイテムを提供できます。

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

その後、コールバックでitem-&gt; 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()

/ヨハネスに同意します。信号を受信したときにアイテムがアクティブになっているかどうかを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top