문제

내가 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 메뉴에서 이전에 선택하지 않은 라디오 버튼을 선택하면 두 번 호출됩니다. 이미 선택된 라디오 버튼을 클릭 한 경우에만 한 번만 호출됩니다.

첫 번째 발사는 "무언가가 더 이상 활성화되지 않는다"고 말하는 것 같고, 두 번째는 새로운 라디오 버튼 활성화를위한 것입니다. 내가 옳고 그른지에 관계없이 질문은 동일합니다. 클릭당 한 번만 핸들러가 조치를 취할 수있는 방법은 무엇입니까? 핸들러가 한 번만 호출되거나 콜백이 "중복"인지 아닌지 알기 위해 내부에서 확인해야 할 것이 필요합니다.

도움이 되었습니까?

해결책

SIGC :: 바인드를 사용하여 항목을 콜백 함수에 인수로 공급할 수 있습니다.

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
        }
    }

다른 팁

그게 나도하는 일이야 signal_toggled() 그리고 확인하는지 확인하십시오 get_active() 사실이다.

나는 당신이 무엇을 달성하려고하는지 정확히 알지 못하지만 (또는 MyClass가 무엇인지, 어떤 기본 클래스가 상속되는지) signal_toggled() 보다 유용 할 수 있습니다 signal_activate()

/Johannes와 동의합니다. 신호를 수신 할 때 품목이 활성화되어 있는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top