GTK Rust绑定0.18.1版本中Inhibit未找到的编译错误解决方法咨询
GTK Rust绑定0.18.1版本中Inhibit未找到的编译错误解决方法咨询
嘿,我来帮你搞定这个编译报错的问题!先理一理你的情况:你在Ubuntu 20.04上用GTK Rust绑定0.18.1版本写窗口示例,结果编译器说找不到Inhibit类型,对吧?
问题根源
你可能不知道,在GTK 3对应的Rust绑定(也就是0.18.x版本)里,Inhibit并不是直接放在gtk根模块下的——它其实属于gdk这个配套crate的内容,所以你直接从gtk里导入肯定找不到啦!而且你之前在gtk3-rs源码里搜不到它,也是因为它不在gtk crate里,而是在gdk crate里~
两种解决办法,选哪个都行
办法一:直接从gdk导入Inhibit
修改你的导入语句,把Inhibit从gdk里引进来就行:
use gtk::prelude::*; use gtk::{Application, ApplicationWindow}; use gdk::Inhibit; // 关键:从gdk导入Inhibit
另外,虽然gdk通常会作为gtk的依赖自动被引入,但保险起见,你可以在Cargo.toml里明确加上它(版本和gtk保持一致):
gtk = "0.18.1" gdk = "0.18.1"
办法二:利用prelude的完整导入(更省心)
其实gtk和gdk的prelude模块已经包含了常用类型的导入,你也可以保留use gtk::prelude::*,再加上use gdk::prelude::*,这样Inhibit就会自动被引入,不用单独写导入语句了:
use gtk::prelude::*; use gdk::prelude::*; use gtk::{Application, ApplicationWindow};
给你修正后的完整示例代码
顺便我还帮你补了点小细节,比如加了Application::new的错误处理,还有把window.show()换成了window.show_all()(确保所有控件都能正常显示):
use gtk::prelude::*; use gtk::{Application, ApplicationWindow}; use gdk::Inhibit; fn main() { let application = Application::new( Some("com.example.GtkExample"), Default::default(), ).expect("创建GTK应用失败"); application.connect_activate(|app| { let window = ApplicationWindow::builder() .application(app) .title("GTK Inhibit Example") .default_width(350) .default_height(70) .build(); window.connect_delete_event(|_, _| { println!("检测到窗口关闭请求"); // 这里可以加确认弹窗,用户取消的话就返回Inhibit(true) Inhibit(true) // 阻止窗口关闭 }); window.show_all(); }); application.run(); }
额外小提示
要是之后你升级到GTK 4的Rust绑定(比如0.7.x版本),Inhibit就会移到gtk根模块下了,到时候直接use gtk::Inhibit就行。不过你现在用的是GTK3的绑定,所以还是按上面的方法来哦~
备注:内容来源于stack exchange,提问作者passinger
相关产品推荐
相关产品推荐

