【问题标题】:gtkmm changing toggle button state without invoking signalgtkmm 在不调用信号的情况下更改切换按钮状态
【发布时间】:2017-08-17 23:34:33
【问题描述】:

我正在尝试制作多个 Gtk::ToggleButton 来充当 Gtk::RadioButton。当按下其中一个按钮时,另一个按钮关闭。

如果 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;
}    
}    

【问题讨论】:

    标签: radio-button gtk signals togglebutton gtkmm


    【解决方案1】:

    直接使用Gtk::RadioButton即可。使用draw-indicator 属性,您可以使它们看起来像普通的切换按钮。

    【讨论】:

      【解决方案2】:

      好的,这是我的解决方法。可能有更好的方法,所以如果你知道的话,请在这里发布:

      首先使用 Gtk::Button 代替 Gtk::ToggleButton 。

      其次,使用 set_state_flags() 代替 set_active()。 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;
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 2011-12-25
        • 2023-03-17
        • 2020-01-04
        • 2017-03-17
        • 1970-01-01
        相关资源
        最近更新 更多