Compartilhando mesmo modelo em duas instâncias QGraphicScene em Qt
-
13-09-2019 - |
Pergunta
Eu tenho um aplicativo que exibe um editor para um diagrama usando QGraphicsScene objeto. Eu gostaria de criar uma leitura única versão do mesmo diálogo, mas tem capacidade para o usuário para ver os dois ao mesmo tempo.
SimScene* pScene1 = new SimScene(model); // adds model to scene
SimScene* pScene2 = new SimScene(model); // adds model to scene
QGraphicsView* pView1 = new QGraphicsView();
pView1->setScene(pScene2);
QGraphicsView* pView1 = new QGraphicsView();
pView2->setScene(pScene2);
Quando eu criar 2 casos de QGraphicsScene e uso addItem na segunda ele remove todos os itens da primeira. Does Qt apoiar qualquer tipo de partilha de modelo entre as cenas? É a minha única escolha para ter mesma cena e tentar personalizar a vista? Mais tarde, a pessoa não parecem funcionar porque a informação de seleção de objeto está dentro dos itens gráficos a ser partilhada por isso, se eu desabilitar bandeiras sobre eles tornam-se apenas de leitura em ambos os pontos de vista. Qualquer conselho é apreciado. Obrigado.
Solução
Eu acho que você está armazenando QSceneItems em classes de modelo. Por causa disso pScene1 e pScene2 está tentando compartilhar não só o modelo em si, mas também os itens de cena. Isso não vai funcionar, porque qualquer item cena podem ser colocados apenas em uma cena a qualquer momento .
Como corrigir isso? modelo de composição não tem conhecimento de qualquer GUI. Deixe-o emitem alterado () notificações sempre algo interessante acontece.
Então deixe cada modelo envoltório SimScene em quaisquer QSceneItems que quer, eo processo mudou () notificações.
Exemplo:
Modelo:
Gráfico,
Beira,
Vertex
GUI
SimScene,
QEdge,
QVertex,
QSimInfo,
Qbackground, e assim por diante ...
Outras dicas
Se você quer apenas um interativo e uma vista só de leitura em seu modelo que você pode usar um único QGraphicsScene e 2 QGraphicsViews. Você apenas tem que chamar QGraphicsView :: setInteractive (false) em um deles. Dessa forma, você não tem que alterar quaisquer bandeiras item.