2012-11-14 3 views
0

라디오 버튼을 선택하면 GTK의 "토글 됨"신호가 발생하지만 그 전에는 이전에 선택한 라디오 버튼이 선택 취소 된 경우에도 신호가 실행됩니다.선택한 경우에만 GTK 라디오 버튼 신호 읽기

각 엔티티 그룹을 나타내는 라디오 버튼을 사용하는 GUI로 작업하고 있습니다. "토글 된"신호 쌍 중 첫 번째 신호는 GUI의 다른 필드에 대한 원치 않는 업데이트를 트리거합니다. 새로 선택한 버튼이 콜백을 트리거 할 때만 발생하는 업데이트입니다. 이 신호를 해결하고 선택 취소 대신 선택 영역에서만 작동하도록 콜백 함수를 제한하려면 어떻게해야합니까? 나는 코딩하는 클래스 내에서 플래그 변수를 고려해 봤지만 GTK가 승인 한 기술이 더 많을 수도 있습니다.

답변

0

나는 라고만 생각합니다.에만 신호를 보내지 만 다른 작업을 수행 할 수 있습니다. 신호 처리기를 작성하여 토글 된 버튼을 가져올 수 있습니다 (여러 버튼에 대해 동일한 핸들러를 다시 사용한다고 가정). 그런 다음 상태를 선택하여 선택 또는 선택 해제되었는지 확인할 수 있습니다.

이 작업을 수행하는 방법은 어댑터와 연결하는 것입니다

: 클래스에서

// do this for each button (this one is for "buttona"): 
buttona.signal_toggled().connect(
    sigc::bind(
     sigc::mem_fun(*this, &myclass::handle_button_toggled), 
     buttona 
    ) 
); 

, handle_button_toggled 버튼 매개 변수를 포함 : C++ 11에서

myclass { 
    Gtk::ToggleButton buttona, buttonb, ... 
    .... 
    void handle_button_toggled(Gtk::ToggleButton &b) { 
    ...check state of b ... 
    } 
} 

을, 당신이 선택적으로 사용할 수 있습니다 람다 식 :

buttona.signal_toggled().connect([this,&buttona]{ 
    handled_button_toggled(buttona); 
}); 
+0

'toggled '신호 대신에'activated' 신호를 연결하여 이것을 달성 할 수 있다고 생각하는 것은 잘못된 것인가? – bluppfisk

0
// C++11 
#include <gtkmm.h> 
#include <iostream> 
#include <vector> 

using namespace std; 

class RadioBox 
{ 
public: 
    Gtk::Box      {Gtk::ORIENTATION_HORIZONTAL}; 
    vector<Gtk::RadioButton*> rb_list; 
    string      selected_text; 
    int       selected_pos; 

    RadioBox(int defpos, 
      std::initializer_list<string> rb_name) 
    { 
     add(box); 
     int i = 0; 
     for (auto& rb_name_i : rb_name) { 
      Gtk::RadioButton* rb = new Gtk::RadioButton{rb_name_i}; 
      rb_list.push_back(rb); 
      if (i==defpos) { 
      rb->set_active(); 
      } 
      box.pack_start(*rb, 0, 0); 
      if (i != 0) { 
      rb->join_group(*rb_list[0]); 
      } 
      rb->signal_toggled().connect(
      sigc::bind(
       sigc::mem_fun(*this, &LabRadio::clicked), 
       rb, 
       i 
      )); 
      i++; 
     } 
    } 

    void clicked(Gtk::RadioButton* rb, int pos) { 
     if (!rb) return; 
     if (rb->get_active()) { 
     selected_pos = pos; 
     selected_text = rb->get_label().c_str(); 
     cout << "RadioButton:selected" 
       << " pos:" << selected_pos 
       << " text:" << selected_text 
       << "\n"; 
     } 
    } 

    ~RadioBox() { 
     rb_count = rb_list.size(); 
     for(int i=0; i < rb_count; ++i) { 
      if (rb_list[i]) delete rb_list[i]; 
     } 
    } 

}; 


//USAGE: 

class mywindow : public Gtk::Window { 
    public: 
    RadioBox myradiobox {2, {"Apples", "Pears", "Oranges", "Peaches"}}; 

    // ... your code here 

    mywindow() { 
    // ... 
    <somewidget>.pack_start(myradiobox.box); 
    // ... 
    } 

};