Обработка событий мыши в зависимости от модификаторов - PullRequest
0 голосов
/ 06 марта 2010

Я написал несколько относительно тривиальных графических интерфейсов в 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), кажется, имеют так много богатых и разнообразных поведений, зависящих от инструментов и модификаторов, что я считаю, что должен быть хороший способ создания этого шаблона.

1 Ответ

1 голос
/ 07 марта 2010

Обработка событий в таких наборах инструментов GUI решает, что делать в соответствии с событием и указанным вами обработчиком события. Что вам нужно, это способ решить, что делать в соответствии с событием, модификатором и обработчиком события. Таким образом, вы можете на основе ваших событий и модификатора вызывать специальный объект обработки событий во всех ваших стандартных обработчиках событий для событий, предоставляемых инструментарием. Вам нужно реализовать объект обработки событий, который в соответствии с четным и модификатором вызовет правильное поведение (обработчик события + модификатора). Это то, что я бы назвал шаблоном проектирования цепочки ответственности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...