首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gtk-rs:如何侦听键盘事件

gtk-rs:如何侦听键盘事件
EN

Stack Overflow用户
提问于 2021-03-09 06:14:25
回答 1查看 1K关注 0票数 0

我使用的是gtk-rs,并希望能够检测到何时按下任何键。

从一些在线搜索来看,在C中实现这一目标的方法似乎是使用gtk_widget_add_events,然后使用g_signal_connectThis answer有一个很好的解释。

在罗斯特,我可以给Widget::add_events打电话。我还找到了g_signal_connect_*的几个定义。但是,这些函数是unsafe,没有文档,而且似乎采用C类型作为参数。

我的问题是:

  1. 为了使用gobject_sys::g_signal_connect_closure,如何创建GObjectGClosure。在铁锈?铁锈结构和闭包可以转换成这样吗?
  2. 是否有一种更好、更惯用的方式来监听关键事件?我很难相信做这样一件基本的事情需要这样一个深奥的界面。我已经看到了对特定键盘快捷键或键盘加速组的一些支持,但是我还没有找到任何文档或示例来监听按键事件。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-09 18:52:08

我想通了。

Thansk @Jmb,Widget::connect是正确的选择。但是,这个函数是没有文档的,并且有一些非常奇怪的类型。下面是我如何使用它的方法:

代码语言:javascript
复制
window
    .connect("key_press_event", false, |values| {
        // "values" is a 2-long slice of glib::value::Value, which wrap G-types
        // You can unwrap them if you know what type they are going to be ahead of time
        // values[0] is the window and values[1] is the event
        let raw_event = &values[1].get::<gdk::Event>().unwrap().unwrap();
        // You have to cast to the correct event type to access some of the fields
        match raw_event.downcast_ref::<gdk::EventKey>() {
            Some(event) => {
                println!("key value: {:?}", std::char::from_u32(event.get_keyval()));
                println!("modifiers: {:?}", event.get_state());
            },
            None => {},
        }

        // You need to return Some() of a glib Value wrapping a bool
        let result = glib::value::Value::from_type(glib::types::Type::Bool);
        // I can't figure out how to actually set the value of result
        // Luckally returning false is good enough for now.
        Some(result)
    })
    .unwrap();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66541725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档