【问题标题】:How to make Gtk.ToggleToolButton behave like radiobuttons?如何让 Gtk.ToggleToolButton 表现得像单选按钮?
【发布时间】:2014-12-17 11:36:22
【问题描述】:

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

【问题讨论】:

  • 为什么不想激活toggle 信号?
  • @ace 因为它会在我两次单击按钮时做出反应(当我实际单击它并更改active 状态时)(这不是我想做的)。
  • 你为什么不加入一些条件,这样代码只有在检查时才会被执行?例如。如果按钮被选中;然后取消选中其他按钮;并在您的取消选中功能中:如果按钮被选中并且 notCheck != "feed";然后 set_active(false); (对不起,我不认识 Vala,无法给出语法上有效的例子)
  • @ace 你的评论让我知道如何解决它:stackoverflow.com/a/27548757/1206421

标签: radio-button gtk vala


【解决方案1】:

我想通了。 clicked 信号仅在按钮的状态发生变化时才起作用,这意味着对我来说它工作了 2 次:对于单击的按钮和未切换的按钮。这创建了一个像这样的无限循环:我有 2 个按钮,我单击第一个按钮,然后单击第二个按钮。第一个的clicked 事件被触发(因为它的状态被改变了)并且它被设置为活动的。现在第二个的clicked 事件被触发,以此类推。这不是我想要的。

我已经像这样为每个人的`clicked 函数添加了一个检查,现在它可以正常工作了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多