如何在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
相关产品推荐
相关产品推荐

