Radio button 如何使Gtk.ToggleToolButton的行为类似于单选按钮?
我正在编写一个Vala应用程序,并在其中使用Gtk.ToggleToolButtons。我希望它们像单选按钮一样工作,例如,当单击其中一个按钮时,其他按钮应设置为非活动状态。问题是,我不知道怎么做 我试着这样做:Radio button 如何使Gtk.ToggleToolButton的行为类似于单选按钮?,radio-button,gtk,vala,Radio Button,Gtk,Vala,我正在编写一个Vala应用程序,并在其中使用Gtk.ToggleToolButtons。我希望它们像单选按钮一样工作,例如,当单击其中一个按钮时,其他按钮应设置为非活动状态。问题是,我不知道怎么做 我试着这样做: public void uncheckButtonsExcept(string notUncheck) { feedButton.active = (notUncheck == "feed"); userButton.active = (notUnche
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");
}
该函数在每个按钮的单击的回调中运行,如下所示:
searchButton.clicked.connect(() => {
uncheckButtonsExcept("search");
});
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;
});
}
但是,当我单击按钮时,程序会出错
我试图将我的所有函数包装到Idle.add()
(因为我的程序在重新绘制不在主线程中的小部件后出现故障时已经遇到了问题),如下所示:
searchButton.clicked.connect(() => {
uncheckButtonsExcept("search");
});
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\u active()
,但它也激活了toggled()
信号,我不想这样做
那么,问题是:如何在不激活单击的回调的情况下设置按钮状态 我知道了。单击的
信号只有在按钮的状态发生变化时才起作用,这意味着在我的情况下,它起了两次作用:单击的按钮和未触动的按钮。这就产生了一个无限循环:我有两个按钮,我点击第一个按钮,然后点击第二个按钮。第一个单击的事件将被触发(其状态已更改),并设置为活动。现在触发第二个单击的事件,依此类推。这不是我想要的
我已经像这样给每个人的“clicked”函数添加了一个检查,现在它的工作方式应该是这样的
feedButton.toggled.connect(() => {
if (!feedButton.get_active())
return;
uncheckButtonsExcept("feed");
});
为什么不想激活切换
信号?@ace,因为它会在我两次单击按钮时(当我实际单击它时,以及当我更改活动
状态时)做出反应(这不是我想做的)。为什么不加入一些条件,这样代码只有在选中时才会执行?例如,是否检查了按钮;然后取消选中其他按钮;在您的取消选中功能中:如果按钮已选中,则取消选中!=“饲料”;然后将_设置为活动(false);(对不起,我不认识Vala,无法给出语法上有效的示例)@ace您的评论给了我解决问题的方法: