gtkmm 在不调用信号的情况下更改切换按钮状态

gtkmm changing toggle button state without invoking signal

我正在尝试让多个 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;
}    
}    

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

首先使用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;

    }
}

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