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

如何在Relm4 GTK窗口失去焦点时关闭窗口并退出应用?

解决GTK窗口失焦时关闭退出的问题

问题分析

你尝试的connect_has_focus_notify和connect_move_focus不适合当前场景:

  • has_focus信号仅针对窗口是否持有键盘焦点,无法准确捕捉窗口因点击外部而失去激活状态的情况
  • move_focus是用于窗口内焦点切换的事件,和窗口整体失焦无关

可靠解决方案

以下两种方式均可实现「窗口失焦时关闭并退出应用」的需求:

方式1:监听focus-out-event事件

该事件会在窗口失去焦点时直接触发,在你的view!宏中添加绑定即可:

view! {
    gtk::Window {
        set_title: Some("Runner"),
        set_default_width: 600,
        set_default_height: 280,
        set_decorated: false,
        connect_focus_out_event[sender] => move |window, _event| {
            // 关闭窗口
            window.close();
            // 完全退出应用(GTK4 写法)
            if let Some(app) = gtk::Application::default() {
                app.quit();
            }
            Inhibit(false)
        }
    }
}

方式2:监听is-active属性变化

is-active属性表示窗口是否处于激活状态,当点击窗口外部时该属性会变为false,监听其变化信号也能实现需求:

view! {
    gtk::Window {
        set_title: Some("Runner"),
        set_default_width: 600,
        set_default_height: 280,
        set_decorated: false,
        connect_notify_local["is-active"][sender] => move |window, _| {
            if !window.is_active() {
                window.close();
                // GTK3 请替换为 gtk::main_quit()
                if let Some(app) = gtk::Application::default() {
                    app.quit();
                }
            }
        }
    }
}

额外说明

  • 若使用GTK3,退出应用需调用gtk::main_quit()而非app.quit()
  • 若窗口不是应用主窗口,关闭窗口后可能不会自动退出,需手动调用退出方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:07