我正在编写Vala应用程序,而且我正在使用Gtk.ToggleToolButtons'在里面。我希望它们的行为像无线电按钮,例如单击其中一个按钮时,其他按钮应设置为非活动状态。问题是,我不知道该怎么做。
我试着这样做:
public void uncheckButtonsExcept(string notUncheck)
{
feedButton.active = (notUncheck == "feed");
userButton.active = (notUncheck == "self");
photoButton.active = (notUncheck == "photo");
searchButton.active = (notUncheck == "search");
newsButton.active = (notUncheck == "news");
}
此功能在每个按钮的clicked
回调中运行,如下所示:
searchButton.clicked.connect(() => {
uncheckButtonsExcept("search");
});
但是,当我点击按钮时,程序会出现段错误。
我试图将我的所有函数都包装到Idle.add()
中(因为我在重新绘制小部件之后的程序段错误时已经遇到了问题),如下所示:
public void uncheckButtonsExcept(string notUncheck)
{
Idle.add(() => {
feedButton.active = (notUncheck == "feed");
userButton.active = (notUncheck == "self");
photoButton.active = (notUncheck == "photo");
searchButton.active = (notUncheck == "search");
newsButton.active = (notUncheck == "news");
return false;
});
}
之后,我的程序不是段错误,而是冻结。
我尝试使用set_active()
,但它也激活了toggled()
信号,我不想这样做。
那么,问题是:如何在不激活clicked
回调的情况下设置按钮状态?
答案 0 :(得分:0)
我想出来了。 clicked
信号仅在按钮的状态发生变化时起作用,这意味着对于我的情况,它工作了2次:对于单击的按钮和未被遮挡的按钮。这创造了一个无限循环:我有2个按钮,我点击第一个按钮,然后点击第二个按钮。第一个clicked
事件被触发(其状态已更改)并且已设置为活动状态。现在触发了第二个clicked
事件,依此类推,依此类推。这不是我想要的。
我已经为每个单击的函数添加了一个检查,现在它的工作方式应该如此。
feedButton.toggled.connect(() => {
if (!feedButton.get_active())
return;
uncheckButtonsExcept("feed");
});