【问题标题】:How to handle mouse motion events in GTK3?如何在 GTK3 中处理鼠标运动事件?
【发布时间】:2017-05-03 15:01:03
【问题描述】:

我正在尝试使用 C/GTK3/Cairo 实现以下功能:

-左键单击 GtkDrawingArea 小部件并打印坐标 Xo 和 Yo。

-在按住左键的同时,移动鼠标并绘制一条连接 (Xo,Yo) 到当前鼠标位置的线。

-松开鼠标左键并 printf("something")

我该怎么做?任何人都知道一个很好的教程来展示如何处理鼠标 clicl-move 事件?

到目前为止,我发现的最好的是这个 zetcode lines (它显示了如何处理鼠标单击事件,但不显示按钮按下/移动/按钮向上和 this ,它解释了如何在何时更改鼠标光标将鼠标悬停在小部件上。

谢谢

【问题讨论】:

  • 通过第一个链接,您应该能够实现您的步骤 1 和 3。如果这还不够,请提供 MCVE 来说明您的问题。
  • 对于第 2 步,您需要保存按下按钮的位置,然后处理 "motion-notify-event" 以进行鼠标的任何移动。

标签: c mouseevent gtk3 cairo


【解决方案1】:

你看到 Gtk 人的this GtkDrawingArea demo了吗?这是用 C 编写的,但 there is a Python version 是同一程序。可惜格式不是很好。

无论如何,在构造函数 (__init__) 中,调用连接到 motion_notify_event

您还需要连接到button_press_eventbutton_release_event

然后,在按下按钮时,保存起点的坐标。 (也将其保存到终点,目前相同)。

在每个 motion_notify_event 上,删除前一行(通过覆盖),然后将其重新绘制到新的终点。

最后,当按钮被释放时,该行是最终的。

如果您使用画布小部件(例如GooCanvas,)会更容易,它负责大部分更新。您可以只更新线对象的坐标,它会自行移动。您也可以轻松删除线条。 '算法'与上面类似:

  • button_press_eventbutton_release_eventmotion_notifyevent 连接到画布,
  • 当按下按钮时,创建一个GooCanvas.polyline 对象,并设置开始和结束点,
  • 更新每个motion_notify_event 上的端点
  • button_release_event 结束。

【讨论】:

  • 两个链接都失效了。请修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2013-05-02
  • 2017-05-03
  • 2018-08-15
相关资源
最近更新 更多