在gui中处理子到父鼠标和键盘事件的最佳方法

Best way to deal with child to parent mouse and keyboard events in a gui?

本文关键字:键盘 事件 方法 最佳 鼠标 gui 处理 理子      更新时间:2023-10-16

对于我的Gui,我想使用以下系统:它的工作方式是,如果鼠标下的小部件没有消耗鼠标或kb事件,它将被传递给该小部件的父级,直到它被消耗或到达桌面。

只有一件事让我困惑。这是否意味着,如果一个按钮,不管出于什么原因,有一个Label作为它的一个子。如果我单击标签,这是否意味着标签下的按钮将单击(因为标签不消耗鼠标),这在本例中是不希望的。这是否意味着我必须执行if(mouseEvent。Source == this){do button stuff} ?

谢谢

如果标签是子部件,那么是的,标签将尝试吃掉事件,失败(因为通常标签没有处理程序方法),因此将事件传递回按钮。

要做到这一点,最简单的方法可能是派生Label类的子类,并重写句柄函数(假设这在您的工具包中是可能的——在任何像样的工具包中都应该是这样)。然后,您可以使用句柄函数来捕获鼠标点击,并将任何其他事件传递回按钮。

比较指针可能是一个坏主意,并且稍微依赖于工具包的实现方式—例如,它可能将源视为按钮(因为这是它所期望的),而不是标签。

虽然我觉得标签本身就是一个小部件非常奇怪.....

看起来您需要一种特殊的"Label"来处理鼠标事件。您应该能够创建一个定制的小部件(从Label派生),该小部件使用针对此特定情况的鼠标事件。

如果Label小部件来自第三方,不能被派生/子类化,则应该将Label包装在另一个小部件中:一个使用鼠标事件的简单小部件,只有一个子部件,即原始Label。