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
属性 您可以使它们看起来像普通的切换按钮。
我正在尝试让多个 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
属性 您可以使它们看起来像普通的切换按钮。