我如何使用 gtk4-rs 的鼠标按钮事件?
How do I use mouse button events with gtk4-rs?
我正在尝试使用 Rust 和 gtk4-rs 在我的应用程序中的 TreeView 上捕获右键单击事件。我没有看到鼠标按钮事件的特定 EventController。我确实看到了 keyboard presses and motion events 之类的事件控制器。我最终使用了 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 的 documentation 声明如下:
EventControllerLegacy is an event controller that provides raw access to the event stream. It should only be used as a last resort if none of the other event controllers or gestures do the job.
我正在使用 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,但如果有的话,差异应该很小。
我正在尝试使用 Rust 和 gtk4-rs 在我的应用程序中的 TreeView 上捕获右键单击事件。我没有看到鼠标按钮事件的特定 EventController。我确实看到了 keyboard presses and motion events 之类的事件控制器。我最终使用了 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 的 documentation 声明如下:
EventControllerLegacy is an event controller that provides raw access to the event stream. It should only be used as a last resort if none of the other event controllers or gestures do the job.
我正在使用 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,但如果有的话,差异应该很小。