You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Glade与GTK+(C语言)实现RUN/KILL Toggle Button互锁联动

实现GTK+ Toggle Button互锁联动的思路与代码示例

我之前做过类似的互锁Toggle Button需求,正好可以给你讲讲怎么实现这个逻辑。核心就是让两个按钮的状态互斥,且只能通过对方来切换状态,不能自己关闭自己。

核心逻辑梳理

  • RUN激活后,只能通过点击KILL来关闭,再次点击RUN无反应;KILL未激活时,重复点击RUN也不会有任何变化。
  • KILL激活后,只能通过点击RUN来关闭,点击自身无效。
  • 两个按钮始终保持最多一个处于激活状态(初始可以都未激活)。

具体实现步骤

1. 获取Glade中的按钮对象

首先从Glade构建器中获取两个Toggle Button的指针,后续用来操作它们的状态:

GtkBuilder *builder = gtk_builder_new_from_file("your_ui.glade");
GtkToggleButton *run_btn = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "run_button"));
GtkToggleButton *kill_btn = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "kill_button"));

(注意替换your_ui.glade和按钮的ID为你实际的文件名和控件ID)

2. 编写按钮的toggled信号回调函数

我们需要拦截按钮的默认切换行为,自定义状态控制逻辑:

RUN按钮的回调函数
void on_run_toggled(GtkToggleButton *button, gpointer user_data) {
    GtkToggleButton *kill_btn = GTK_TOGGLE_BUTTON(user_data);
    // 获取当前点击后想要切换到的状态
    gboolean target_active = gtk_toggle_button_get_active(button);

    // 两种情况阻止状态切换:
    // 1. 想要激活RUN,但KILL已经处于激活状态(互斥)
    // 2. 想要关闭RUN(只能通过KILL按钮,不能自己点自己关)
    if ((target_active && gtk_toggle_button_get_active(kill_btn)) || !target_active) {
        // 恢复按钮原来的状态,阻止默认切换
        gtk_toggle_button_set_active(button, !target_active);
        return;
    }

    // 如果允许激活RUN,确保KILL处于未激活状态
    gtk_toggle_button_set_active(kill_btn, FALSE);
}
KILL按钮的回调函数

逻辑和RUN对称:

void on_kill_toggled(GtkToggleButton *button, gpointer user_data) {
    GtkToggleButton *run_btn = GTK_TOGGLE_BUTTON(user_data);
    gboolean target_active = gtk_toggle_button_get_active(button);

    if ((target_active && gtk_toggle_button_get_active(run_btn)) || !target_active) {
        gtk_toggle_button_set_active(button, !target_active);
        return;
    }

    gtk_toggle_button_set_active(run_btn, FALSE);
}

3. 连接信号与回调

把两个按钮的toggled信号和对应的回调函数绑定,同时把对方按钮的指针作为user_data传递过去,这样回调里就能直接操作另一个按钮:

g_signal_connect(run_btn, "toggled", G_CALLBACK(on_run_toggled), kill_btn);
g_signal_connect(kill_btn, "toggled", G_CALLBACK(on_kill_toggled), run_btn);

额外说明

  • 初始状态你可以根据需求设置,比如默认都未激活:gtk_toggle_button_set_active(run_btn, FALSE); gtk_toggle_button_set_active(kill_btn, FALSE);
  • 如果需要扩展其他逻辑(比如激活按钮时执行特定任务),可以在回调里允许状态切换的分支里添加你的业务代码。

内容的提问来源于stack exchange,提问作者Leigh K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:21:54