GTKMM 팝업 목록에서 신호가 두 번 발생합니다
문제
내가 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와 동의합니다. 신호를 수신 할 때 품목이 활성화되어 있는지 확인하십시오.