Я написал несколько относительно тривиальных графических интерфейсов в WxWidgets и Qt, и я постоянно не уверен, как архитектурно обрабатывать следующие ситуации:
- Вы ловите событие мыши, чтобы что-то сделать с графическим объектом в вашем графическом интерфейсе
- То, что вы делаете с объектом, зависит от того, какие клавиши-модификаторы пользователь удерживает нажатой
В начале я обычно делаю что-то вроде следующего:
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...
В конце концов, с похожим кодом if / else / switch во многих обработчиках mousePressEvent, mouseReleaseEvent, это кажется немного громоздким, поэтому я пытаюсь инкапсулировать некоторые повторения, переводя объект в разные «режимы» в зависимости от того, какие модификаторы отключены , Тем не менее, я все еще чувствую, что мне не хватает какого-то красивого элегантного решения.
Я пытался взглянуть на код различных инструментов с открытым исходным кодом, но я не нашел ничего осязаемого (эээ, простого), достаточного, чтобы направить меня в другом направлении.
Некоторые инструменты (скажем, GIMP), кажется, имеют так много богатых и разнообразных поведений, зависящих от инструментов и модификаторов, что я считаю, что должен быть хороший способ создания этого шаблона.