如何使用Rust和GTK4高效开发GUI应用?

摘要:简记 这是我第二次从头开始阅读,有第一次的印象要容易不少。 如果只关心具体的做法,而不思考为什么这样做,以及整体的框架,阅读的过程将会举步维艰。 简略记录 gtk-rs 的书中提到的点。对同一个问题书中所演示了多种处理方法,而且跨度比较大,
简记 这是我第二次从头开始阅读,有第一次的印象要容易不少。 如果只关心具体的做法,而不思考为什么这样做,以及整体的框架,阅读的过程将会举步维艰。 简略记录 gtk-rs 的书中提到的点。对同一个问题书中所演示了多种处理方法,而且跨度比较大,第一次阅读的时候经常出现忘记之前的内容。 fn signals() -> &'static [Signal] { static SIGNALS: OnceLock<Vec<Signal>> = OnceLock::new(); SIGNALS.get_or_init(|| { vec![Signal::builder("max-number-reached") .param_types([i32::static_type()]) .build()] }) } signals: max-number-reached(i32) GTK GObject 的缺点 Reference cycles Not thread safe 使用异步块/函数一般是通过 glib::spawn_future_local() spawn. 异步函数之间的通信是使用 async_channel。 有些异步库依赖 tokio runtime 不能直接通过 GLib 的主线程 spawn。 通过这样一个函数返回的 runtime 来 spawn。 use std::sync::OnceLock; use tokio::runtime::Runtime; fn runtime() -> &'static Runtime { static RUNTIME: OnceLock<Runtime> = OnceLock::new(); RUNTIME.get_or_init(|| { Runtime::new().expect("Setting up tokio runtime needs to succeed.") }) } 设置(Settings) GTK 应用的设置是通过一个 .gschema.xml 文件描述。 <?xml version="1.0" encoding="utf-8"?> <schemalist> <schema id="org.gtk_rs.Settings1" path="/org/gtk_rs/Settings1/"> <key name="is-switch-enabled" type="b"> <default>false</default> <summary>Default switch state</summary> </key> </schema> </schemalist> 设置是在应用关闭后再打开,仍然保持关闭前的状态。这个 GSchema xml 需要编译安装。 mkdir -p $HOME/.local/share/glib-2.0/schemas cp org.gtk_rs.Settings1.gschema.xml $HOME/.local/share/glib-2.0/schemas/ glib-compile-schemas $HOME/.local/share/glib-2.0/schemas/ settings 的状态绑定到 widget,是调用 settings 的 bind() 方法。把某个属性绑定到某一个属性是通过源对象 bind_property() 方法 第8章 Saving Window State 还是使用 GTK 的设置,只不过在 GTK 的对象系统中使用了自己定义的方法(在 Rust 中我分不出哪个是class struct 和 instance struct,不过我知道状态放在 imp.rs,方法一般是 mod.rs ,如果实际写的时候放在一个文件里面就是把 imp.rs 中的内容放到对应的 mod.rs 并且用 mod imp {} 包裹)。
阅读全文