2010-03-05 75 views
0

道歉,如果这是一个模糊的问题,没有正确的答案。如果它不在正确的位置,请移动/关闭它。设计:处理依赖于修饰符的鼠标事件

我已经写在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的其他工具包。)

最后,与同类如果大量mousePressEvent,mouseReleaseEvent处理程序/其它/开关的代码,这似乎有点笨拙,所以我尝试并通过将对象放入不同的“模式”来取决于哪些修饰符关闭来封装一些重复。尽管如此,我仍然觉得我错过了一些不错的优雅解决方案。我试图查看各种开源工具的代码,但我没有发现任何有形的(呃,简单的)足以让我指向不同的方向。一些工具(比如说GIMP)似乎有许多丰富多样的依赖于工具和修饰符的行为,我认为这是构建这种模式的一种不错的方式。任何建议将受到感谢。

回答

1

恕我直言,在这样的GUI工具包中的事件处理决定根据您提供的事件和事件处理程序执行什么操作。你需要的是一种根据事件,修饰符和事件处理程序来决定做什么的方法。因此,您可以基于您的事件和修改器调用所有标准事件处理程序中的特殊事件处理对象来处理由该工具提供的事件。你必须实现的是事件处理对象,它将根据even和modifier调用正确的行为(event +修饰符处理程序)。这就是我所说的责任链设计模式。

+0

@加布里埃尔:感谢您的意见,它给了我一些想法。正如你所建议的,定义一个链式责任类型的处理程序似乎是管理这里各种排列的好方法。我会做更多的阅读,并尝试找出一种在我想象的背景下实现它的好方法。 – Mikesname 2010-03-08 23:02:14