Я пытаюсь спроектировать приложение с несколькими окнами, чтобы использовать каркас модели / представления Qt, чтобы я мог убрать много сложной логики из моих QGraphicsItem
классов.
Как показано на рисунке ниже, приложение состоит из двух (или более) видов, каждый из которых содержит одинаковую серию красных вертикальных направляющих линий A1
, B1
, C1
... в одинаковых горизонтальных положениях. вдоль каждого вида.
Я бы хотел убедиться, что когда пользователь перетаскивает контрольную линию в одном виде, скажем, из точки A1
в A_1'
, как показано на рисунке выше, все соответствующие контрольные линии в других видах движутся одинаково расстояние и в том же направлении, например, от A2
до A2'
. Также не должно быть возможности провести одну направляющую линию за другой, то есть направляющие должны сохранить свои относительные порядки. Это часть логики, которую я хотел бы перенести из моего класса GuideLine в модель.
Мне известны триггеры перетаскивания направляющих линий QGraphicsItem :: itemChange, как показано во фрагменте ниже. То, что я не знаю, как лучше
- Перенаправить значение кандидата в модель для проверки (и хранения). Мне известно, что представление - это интерфейс «стандартный интерфейс для взаимодействия с моделями через механизм сигналов и слотов». Большая проблема, на мой взгляд, заключается в том, что
QGraphicsItem::itemChange
должен немедленно возвращать проверенное значение, которое он не может использовать для асинхронного механизма слотов сигналов.
- Уведомлять направляющие линии в других видах об изменениях, не вызывая создания каскада уведомлений, например, когда
A1
и B1
бесконечно уведомляют друг друга.
-
class GuideLine( QtGui.QGraphicsLineItem ):
...
# Called when item is about to change to value
def itemChange( self , change , value ):
# TODO
# 1. validate value in model
# 2. if change is valid notify peers in other views
pass