鼠标交互的设计模式

mik*_*ike 4 qt design-patterns

我需要一些关于什么是一般鼠标交互的“理想”设计模式的意见。

这里是简化的问题。我有一个小型 3D 程序(QT 和 openGL),我使用鼠标进行交互。每次交互通常不仅是单个函数调用,而且大多由最多 3 个函数调用(启动、执行、结束)执行。例如,相机旋转:这里初始函数调用将传递当前的第一个鼠标位置,而执行函数调用将更新相机等。

然而,对于只有几个交互,硬编码这些(在 MousePressEvent、MouseReleaseEvent、MouseMoveEvent 或 MouseWheelEvent 等内部)并不是什么大问题,但如果我考虑更高级的程序(例如 20 个或更多交互),则需要适当的设计。

因此,你将如何在QT内部设计这样的交互。

我希望我的问题足够清楚,否则不要抱怨:-)

谢谢

Ant*_*ony 5

我建议使用多态性和工厂方法模式。这是一个例子:

在我的 Qt 程序中,我有 QGraphicsScenes 和 QGraphicsItems 以及 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent,如下所示:

void CustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
  // call factory method, which returns a subclass depending on where click occurred
  dragHandler = DragHandler::createDragHandler(event /* and other relevant stuff */);
}

void CustomItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
  dragHandler->onMouseMove(event);
}

void CustomItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
  dragHandler->onMouseRelease(event);
  delete dragHandler;
}
Run Code Online (Sandbox Code Playgroud)

这种特殊情况下的想法是,根据我单击 CustomItem 的位置,鼠标按下、移动和释放将具有不同的功能。例如,如果我单击项目的边缘,拖动将调整其大小,但如果我单击项目的中间,拖动将移动它。DragHandler::onMouseMove 和 DragHandler::onMouseRelease 是由子类重新实现的虚拟函数,以根据鼠标按下发生的位置提供我想要的特定功能。不需要 DragHandler::onMousePress 因为它基本上是构造函数。

这当然是一个相当具体的示例,可能不完全是您想要的,但它让您了解如何使用多态性来清理鼠标处理。