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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:53:05