如何使Gtk.Toggle按钮表现得像单选按钮?

时间:2014-12-17 11:36:22

标签: radio-button gtk vala

我正在编写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回调的情况下设置按钮状态?

1 个答案:

答案 0 :(得分:0)

我想出来了。 clicked信号仅在按钮的状态发生变化时起作用,这意味着对于我的情况,它工作了2次:对于单击的按钮和未被遮挡的按钮。这创造了一个无限循环:我有2个按钮,我点击第一个按钮,然后点击第二个按钮。第一个clicked事件被触发(其状态已更改)并且已设置为活动状态。现在触发了第二个clicked事件,依此类推,依此类推。这不是我想要的。

我已经为每个单击的函数添加了一个检查,现在它的工作方式应该如此。

    feedButton.toggled.connect(() => {
        if (!feedButton.get_active())
            return;
        uncheckButtonsExcept("feed");
    });