2017-03-24 51 views
0

我試圖讓多個Gtk :: ToggleButton作爲Gtk :: RadioButton。當其中一個按鈕被按下時,另一個按鈕關閉。gtkmm更改切換按鈕狀態,無需調用信號

如果Gtk :: ToggleButton沒有自己處理切換(按下或不按下),它就像創建switch語句一樣簡單。因此,我打算將它作爲常規按鈕進行切換,調用signal_clicked()。connect(),它調用set_active(true/false)函數,使按鈕被按下或不按下。

這裏是例子我想要做的事:

事件調用按鈕被點擊時:

//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 :: Button,而不是Gtk :: ToggleButton。

其次代替set_active()使用set_state_flags()。 Gtk :: STATE_FLAG_CHECKED,當你希望它被啓用時,GTK :: STATE_FLAGS_NORMAL,當你想要它被禁用。

所以,這是代碼應如何看起來像:

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

只需直接使用Gtk::RadioButton。使用draw-indicator屬性,您可以使它們看起來像常規切換按鈕。