如何使用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 {} 包裹)。
