为什么这个 GestureMultiPress 没有注册我的印刷机?

问题描述 投票:0回答:0

我正在使用 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 : &gtk::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();
}
rust gtk
© www.soinside.com 2019 - 2024. All rights reserved.