我正试图使用Rust和gtk4-rs在应用程序中的TreeView上捕获一个右键单击事件。我没有看到鼠标按钮事件的特定EventController。我确实看到EventControllers用于键盘按压和运动事件。我最终使用了EventControllerLegacy,只是检测到了闭包中的事件类型,但我觉得这里缺少了一些东西。有没有其他方法可以让我从鼠标中获取按键事件?这是我的代码:
pub fn build_tree_view() -> TreeView {
let tree_view: TreeView = TreeView::new();
tree_view.set_headers_visible(false);
let event_controller = EventControllerLegacy::new();
event_controller.connect_event(|controller, event| {
if event.event_type() == ButtonPress {
let button_event = event.clone().downcast::<ButtonEvent>().unwrap();
if button_event.button() == GDK_BUTTON_SECONDARY as u32 {
println!("got mouse button: {}", button_event.button());
}
}
return Inhibit(false);
});
tree_view.add_controller(&event_controller);
return tree_view;
}
我认为我遗漏了一些东西的原因是EventControllerLegacy的文档声明如下:
EventControllerLegacy是一个事件控制器,提供对事件流的原始访问。只有在其他事件控制器或手势都不起作用的情况下,才应将其用作最后手段。
我使用的是Rust 1.56.0和gtk4 rs 0.4.2
感谢
如果您查看示例,通常在这种情况下使用gtk::GestureClick
。要检测右键点击,你可以这样使用:
pub fn build_tree_view() -> TreeView {
let tree_view: TreeView = TreeView::new();
tree_view.set_headers_visible(false);
// Create a click gesture
let gesture = gtk::GestureClick::new();
// Set the gestures button to the right mouse button (=3)
gesture.set_button(gtk::gdk::ffi::GDK_BUTTON_SECONDARY as u32);
// Assign your handler to an event of the gesture (e.g. the `pressed` event)
gesture.connect_pressed(|gesture, _, _, _| {
gesture.set_state(gtk::EventSequenceState::Claimed);
println!("TreeView: Right mouse button pressed!");
});
// Assign the gesture to the treeview
tree_view.add_controller(&gesture);
return tree_view;
}
注:示例适用于Rust 1.58和gtk4 0.4.4,但差异应该很小(如果有的话(。