Скрин моего проекта.
Можно было бы обойтись без него, но может вы порадуетесь за меня :). Всё пилю и пилю свой проект. Сейчас конкретно занимаюсь рефакторингом. Удалил кучу всего и переделывают это с нуля.
А теперь по теме.
Есть док. В нем расположены всяческие настойки инструмента. На картинке он слева. В зависимости от выбранного инструмента (6 синих иконок) там показываются соответствующие параметры инструмента (как в GIMP и куче других программ).
Есть сцена. В ней пользователь может создавать инструмент. На картинке один из инструментов расположен по центру, зелёненький такой. Разные инструменты характеризуются разными параметрами. Геометрически это всегда или полилинии, или прямоугольники, так что во-первых они характеризуются геометрическими параметрами. Помимо этого, есть и другие параметры, персональные для каждого инструмента. Все они унаследованы от QGraphicsObject, то есть умеют сигналы и слоты.
Когда пользователь создаёт инструмент, нужно:
- Наладить связь между изменением значений в доке и инструментом. Пользователь меняет циферки — меняется инструмент.
- Наладить связь между изменением геометрии инструмента и обновлением значений в доке. Пользователь меняет инструмент (мышкой таскает) — обновляются значения в доке.
- Передать инструменту изначальные параметры (те, что вбиты в доке на момент создания его пользователем).
Было сделано совсем коряво, даже и не буду говорить как. Теперь хочу сделать так.
Все параметры можно условно разделить на параметры геометрии и параметры конкретного типа инструмента. Значит, можно ввести сигналы-слоты, связанные с геометрией (аргументы QRectF или QPolygonF), и сигналы-слоты, связанные с параметрами конкретного типа инструмента (в качестве аргументов — SelectionParameters, BlockCreatorParameters и т.п.).
- Сцена дублирует все сигналы, посылающиеся доком для изменения параметров инструментов. То есть там есть сигналы: setToolGeometry(QRectF), setToolGeometry(QPolygonF), setToolProperties(SelectionParameters), setToolProperties(BlockCreatorParameters), ... Эти сигналы MainWindow в конструкторе соединяет с соответствующими сигналами дока. Инструмент в конструкторе подключает часть из этих сигналов к своим слотам.
- Сцена дублирует все сигналы, посылающиеся при изменении параметров инструментов: toolGeometryChanged(QRectF), toolGeometryChanged(QPolygonF), toolPropertiesChanged(SelectionParameters). MainWindow в конструкторе соединяет эти сигналы с соответствующими слотами дока. Инструмент в конструкторе подключает свои сигналы к части сигналов сцены.
- Инструмент после налаживания всех связей испускает сигнал needSettings(). Это вызывает испускание сценой сигнала needToolSettings(). Этот сигнал принимается слотом дока emitToolSettings(). В этом слоте док испускает сигналы с настроками выбранного инструмента.
Спасибо всем осилившим сей поток информации! А теперь вопрос. Хороший ли это план, или же вы поступили бы иначе?
qt