2017-03-24 50 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属性,您可以使它们看起来像常规切换按钮。