代码之家  ›  专栏  ›  技术社区  ›  Mikesname

设计:处理依赖于修饰符的鼠标事件

  •  0
  • Mikesname  · 技术社区  · 16 年前

    如果这是一个模糊的问题,没有正确的答案,请道歉。如果不在正确的位置,请移动/关闭它。

    我在wxwidgets和qt中编写了一些相对简单的gui,我一直不确定如何在架构上处理以下情况:

    • 捕捉鼠标事件以对图形用户界面中的图形对象执行操作
    • 你对这个对象做什么取决于用户按下的修改键

    一开始我通常会做如下事情:

    void MyClass::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
    {
        if (event->modifiers() & Qt::AltModifier) {
            // do something
        } else if (event->modifiers() & Qt::ControlModifier) {
            // do something else
        } else {
            // do yet another thing  
        }
    }
    
    // Repreat ad-nausium for other mouse click/move events...
    

    (这是一个一般性的问题,我可以为qt以外的工具包粘贴类似的代码。)

    最后,在许多mousepresessevent和mousereleaseevent处理程序中使用类似的if/else/switch代码,这看起来有点笨拙,所以我尝试通过将对象放入不同的“模式”来封装一些重复,具体取决于关闭了哪些修饰符。尽管如此,我还是觉得我错过了一些优雅的解决方案。我试过查看各种开源工具的代码,但没有发现任何有形的(呃,简单)足以让我指向不同的方向。

    一些工具(比如,gimp)似乎有很多丰富多样的依赖于工具和修改器的行为,我觉得应该有一种很好的方法来构建这个模式。如有任何建议,将不胜感激。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Gabriel Ščerbák    16 年前

    imho,这种gui工具包中的事件处理根据您提供的事件和事件处理程序来决定要做什么。您需要的是根据事件、修饰符和事件处理程序来决定要做什么的方法。因此,您可以基于事件和修饰符调用工具it提供的事件的所有标准事件处理程序中的特殊事件处理对象。您必须实现的是事件处理对象,它将根据偶数和修饰符调用正确的行为(事件+修饰符处理程序)。这就是我所说的责任链设计模式。