2013-01-31 16 views
5

Piszę aplikację Qt opartą na kanwie QGraphicsScene z ruchomymi kształtami i próbuję zintegrować funkcjonalność cofania przywracania. W przypadku większości funkcji, takich jak tworzenie i usuwanie kształtów, bardzo proste jest implementowanie na samym modelu QGraphicsScene, ale chcę, aby elementy były ruchome i aby ruch był nieodwracalny. Teraz używam gumowej opaski dragmode na scenie i flag na ItemIsSelectable i ItemIsMovable na przedmiotach. Problem polega na tym, że wydaje się, że nie ma dobrego miejsca do stworzenia modelu QUndoCommand, który reprezentowałby ruch kształtu. Jeśli robię to w ramach metody QGraphicsScene::itemChange, to wybranie i przeniesienie dwóch lub więcej kształtów powoduje oddzielne polecenia cofania dla różnych obiektów, które są przeplatane, a zatem nie można ich scalić, więc cofnięcie powoduje nieoczekiwane zachowanie. W telefonie QGraphicsScene nie ma zdarzenia, które zostanie wywołane, gdy jego elementy zostaną przeniesione, co mogę zobaczyć, więc utknąłem.Qt: Właściwa integracja cofania frameworka z QGraphicsScene

Najgorszy scenariusz, że widzę to, że mogę wyłączyć flagę ItemIsMovable na moich zwyczaj QGraphicsItem obiektów i obsługiwać ruch całkowicie w QGraphicsScene zdarzenia myszy, ale reimplementing tę funkcjonalność właściwie wydaje się dość skomplikowany (sprawdziłem jak Qt czyni go wewnętrznie i jest dość dużo kodu do obsługi skomplikowanych przypadków, na przykład gdy wybrany jest obiekt i niektóre jego dzieci). Wydaje się to być najbardziej oczywistym przypadkiem użycia dla stosu cofania (tak bardzo, że przykładowy program dla struktury cofania to program podobny do mojego, z wyjątkiem braku obsługi wielu obiektów), więc wydaje się dziwne, że nie ma wbudowanego sposób na to, bez ponownego wdrażania znaczącej części podstawowej funkcjonalności. Czy ktoś ma jakieś spostrzeżenia lub przykłady programów, które to robią?

Odpowiedz

4

Rozwiązałem to nieco hackishly myślę. Dodałem właściwość preMovePoint do moich niestandardowych kształtach iw mousePressedEvent z QGraphicsScene, ustawić preMovePoint każdego z wybranych kształtów do odpowiednich pozycjach bieżących, aw mouseReleaseEvent, utworzony kompozytowy polecenie przejścia od preMovePoint do bieżącego pos z każdy kształt. Wciąż chciałbym wiedzieć, czy jest lepszy sposób.

+0

Wpadłem na podobnie hackowatą poprawkę, która dotyczyła poprzedniego stosu lokalizacji w każdym "QGraphicsItem", a następnie pchania elementów, które zostały zmienione na stos cofania. Jest brzydki, ale działa. Dziękuję za pytanie i odpowiedź. –