我正在使用 gtk-rs (GTK+ 3) 制作一个小应用程序,但我无法让它注册我的鼠标点击。
我有一个
DrawingArea
,每次在那个DrawingArea
中单击鼠标时,我都想运行一些代码。我的理解是我可以使用GestureMultiPress
来做到这一点。 (我知道事件也可以做到这一点,但我的理解是多次按下手势也可以做到这一点,而且我的印象是它们(手势)是更现代的风格。)
这是我设置
GestureMultiPress
代码的方法:
let drw_area : DrawingArea = ...;
...
window.add(&drw_area);
...
window.add_events(EventMask::BUTTON_PRESS_MASK | EventMask::BUTTON_RELEASE_MASK);
let press =
GestureMultiPress::builder()
.button(0)
.widget(&drw_area)
.build();
let _press_handler_id = {
press.connect_pressed(|g, npress, x, y| {
println!("({}, {npress}, {x}, {y})", g.current_button());
})
};
...
我期待它在我在绘图区域中单击/释放时打印鼠标坐标,而在我在应用程序边框中单击/释放时不打印。但是,它根本没有打印。
我在这里错过了什么/做错了什么?
谢谢!
完整代码:
use gtk::gdk::EventMask;
use gtk::prelude::*;
use gtk::{DrawingArea, GestureMultiPress};
const APP_NAME : &'static str = "com.example.appname";
const APP_TITLE : &'static str = "Example App";
const APP_WIDTH : i32 = 600;
const APP_HEIGHT : i32 = 600;
const APP_BORDER_WIDTH : u32 = 20;
fn build_ui(application : >k::Application) {
let window = gtk::ApplicationWindow::new(application);
window.set_title(APP_TITLE);
window.set_border_width(APP_BORDER_WIDTH);
window.set_position(gtk::WindowPosition::Center);
window.set_default_size(APP_WIDTH, APP_HEIGHT);
let drw_area = {
DrawingArea::builder()
.width_request(APP_WIDTH - 2*APP_BORDER_WIDTH as i32)
.height_request(APP_HEIGHT - 2*APP_BORDER_WIDTH as i32)
.build()
};
drw_area.connect_draw(|a, c| {
c.set_source_rgb(0.0, 0.0, 0.0);
c.rectangle(0.0, 0.0, a.allocated_width() as f64, a.allocated_height() as f64);
let _ = c.fill();
Inhibit(false)
});
window.add(&drw_area);
window.add_events(EventMask::BUTTON_PRESS_MASK | EventMask::BUTTON_RELEASE_MASK);
let press =
GestureMultiPress::builder()
.button(0)
.widget(&drw_area)
.build();
let _press_handler_id = {
press.connect_pressed(|g, npress, x, y| {
println!("({}, {npress}, {x}, {y})", g.current_button());
})
};
window.show_all();
}
fn main() {
let application =
gtk::Application::new(Some(APP_NAME), Default::default());
application.connect_activate(build_ui);
application.run();
}