Обратите внимание, что вложенные переключатели можно перевернуть: внутренние переключатели можно поднять наружу и наоборот. Таким образом, вы можете поднять переключатель на mode_
до внешнего уровня.
Возможное решение - создать интерфейс, скажем Mode
, который обрабатывает события для определенного режима:
class Mode {
public:
virtual void mousePressEvent(QMouseEvent *e) = 0;
// ... and so on for other events
};
Конкретные реализации, такие как ModeView
и ModeEdit
, могут затем обрабатывать события. Если вы не хотите обрабатывать все события во всех случаях, предоставьте этому интерфейсу пустые реализации вместо чисто виртуальных функций. Если между отдельными режимами есть общие функции, вы даже можете создать промежуточный класс, от которого наследуются эти классы режимов.
Пусть _mode
будет указателем на Mode
для представления текущего режима, и тогда ваш «главный» обработчик станет:
void Render::Viewer::mousePressEvent(QMouseEvent* e) {
_mode->mousePressEvent(e);
}