2017-03-24 11 views
0

私はGtk :: RadioButtonとして動作する複数のGtk :: ToggleButtonを作成しようとしています。いずれかのボタンが押されると、他のスイッチはオフになります。gtkmm信号を呼び出さずにトグルボタンの状態を変更する

Gtk :: ToggleButtonが切り替え(押されているか押されていない)を単独で処理していない場合は、switch文を作成するだけで簡単です。

私はsignal_clicked()を呼び出して通常のボタンとして処理することを計画しています。ボタンを押したか押さなかったset_active(true/false)関数を呼び出すconnectここで

は私がやろうとしているものの例です:ボタンがクリックされたときに

イベントを呼び出します:

ボタンをトグル
//enum {infoState, artState, editState, userState, exitState}; is initialised in header 

artButt.signal_clicked().connect(sigc::bind<short int>(sigc::mem_fun(*this, &fooclass::toggleButton), artButt)); 
editButt.signal_clicked().connect(sigc::bind<short int>(sigc::mem_fun(*this, &fooclass::toggleButton), editButt)); 

void fooClass::toggleButton() 
{ 
//oldState and enum {infoState, artState, editState, userState, exitState}; are initialised in header 
if(oldState != newState) 
{ 
    //disable old togglebutton 
    switch (oldState) 
     { 
      case infoState: 
       infoButt.set_active(false); 
      break; 
      case artState: 
       artButt.set_active(false); 
      break; 
      case editState: 
       editButt.set_active(false); 
      break; 
      case userState: 
       userButt.set_active(false); 
      break; 
     } 

     //enable new one 
     switch (newState) 
     { 
      case infoState: 
       userButt.set_active(false); 
      break; 
      case artState: 
       artButt.set_active(true); 
      break; 
      case editState: 
       editButt.set_active(true); 
      break; 
      case userState: 
       userButt.set_active(true); 
      break; 
     } 
     oldState = newState; 
}  
}  

答えて

0

オクラホマので、ここに私がいます回避策。おそらく良い方法がありますので、ここに投稿することが分かっていれば教えてください:

まず、Gtk :: ToggleButtonの代わりにGtk :: Buttonを使用してください。

第2に、set_active()の代わりにset_state_flags()を使用します。 Gtk :: STATE_FLAG_CHECKEDを有効にするにはGTK :: STATE_FLAGS_NORMALを無効にする必要があります。

だから、これはコードは次のようになります方法です:ちょうど直接Gtk::RadioButtonを使用

void Window::changeState() 
{ 
    if(oldState != state) 
    { 
     //delete old state 
     switch (oldState) 
     { 
      case infoState: 
       infoButt.set_state_flags(Gtk::STATE_FLAG_NORMAL); 
      break; 
      case artState: 
       artButt.set_state_flags(Gtk::STATE_FLAG_NORMAL); 
      break; 
      case editState: 
       editButt.set_state_flags(Gtk::STATE_FLAG_NORMAL); 
      break; 
      case userState: 
       userButt.set_state_flags(Gtk::STATE_FLAG_NORMAL); 
      break; 
     } 
     //move to new state 
     switch (state) 
     { 
      case infoState:   
       infoButt.set_state_flags(Gtk::STATE_FLAG_CHECKED); 
      break; 
      case artState: 
       artButt.set_state_flags(Gtk::STATE_FLAG_CHECKED); 
      break; 
      case editState: 
       head.editButt.set_state_flags(Gtk::STATE_FLAG_CHECKED); 
      break; 
      case userState: 
       userButt.set_state_flags(Gtk::STATE_FLAG_CHECKED); 
      break; 

      case exitState: 
       close(); 
      break; 
     } 

     show_all_children(); 
     oldState = state; 

    } 
} 
0

draw-indicatorプロパティでは、通常のトグルボタンのように見えるようにすることができます。

関連する問題