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ą?
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ź. –