2013-01-31 19 views
5

Tôi đang viết một ứng dụng Qt dựa trên canvas QGraphicsScene có hình dạng di động trên đó và tôi đang cố gắng tích hợp chức năng hoàn tác làm lại. Đối với hầu hết các chức năng như tạo và xóa các hình dạng, nó khá tầm thường để thực hiện trên chính bản thân số QGraphicsScene, nhưng tôi muốn các phần tử có thể di chuyển được và để chuyển động có thể hoàn tác được. Hiện tại tôi đang sử dụng tính năng dragmode của ban nhạc cao su trên cảnh và các cờ ItemIsSelectableItemIsMovable trên các mục. Vấn đề là dường như không có nơi tốt để tạo ra các QUndoCommand để đại diện cho phong trào hình dạng. Nếu tôi làm điều đó trong phương thức QGraphicsScene::itemChange, sau đó chọn và di chuyển hai hoặc nhiều hình dạng dẫn đến các lệnh hoàn tác riêng biệt cho các đối tượng khác nhau được xen kẽ và do đó không thể hợp nhất được, do đó, hoàn tác các kết quả trong hành vi không mong muốn. Không có sự kiện nào trong số QGraphicsScene được gọi khi các mục của nó được di chuyển xung quanh mà tôi có thể thấy, vì vậy tôi bị kẹt.Qt: Tích hợp đúng khung hoàn tác với QGraphicsScene

Các trường hợp xấu nhất mà tôi nhìn thấy là tôi vô hiệu hóa các ItemIsMovable cờ trên các đối tượng tùy chỉnh QGraphicsItem tôi và xử lý chuyển động hoàn toàn trong QGraphicsScene sự kiện chuột, nhưng reimplementing chức năng mà dường như đúng khá phức tạp (tôi đã kiểm tra như thế nào Qt làm nó trong nội bộ và có khá nhiều mã để xử lý các trường hợp phức tạp, chẳng hạn như nơi một đối tượng và một số con của nó đều được chọn). Điều này có vẻ như rõ ràng nhất trong trường hợp sử dụng cho ngăn xếp hoàn tác (rất nhiều để chương trình mẫu cho khung hoàn tác là một chương trình QGraphicsScene giống như của tôi, ngoại trừ không có hỗ trợ chuyển động đối tượng nhiều). cách để làm điều đó mà không cần thực hiện lại một phần quan trọng của chức năng cốt lõi. Có ai có bất kỳ thông tin chi tiết hoặc ví dụ về các chương trình thực hiện việc này không?

Trả lời

4

Tôi đã giải quyết được vấn đề này một cách đáng sợ. Tôi đã thêm một tài sản preMovePoint hình dạng tùy chỉnh của tôi và trong mousePressedEvent của QGraphicsScene, tôi đặt preMovePoint của mỗi hình dạng được lựa chọn vào các vị trí hiện tại của mình, và trong mouseReleaseEvent, tạo ra một lệnh di chuyển hợp từ preMovePoint với dòng pos của mỗi hình dạng. Tôi vẫn muốn biết nếu có cách nào tốt hơn.

+0

Tôi đã đưa ra một bản sửa lỗi tương tự liên quan đến một ngăn xếp vị trí trước đó trong mỗi 'QGraphicsItem' và sau đó đẩy các mục đã được thay đổi sang ngăn xếp hoàn tác. Nó xấu nhưng nó hoạt động. Cảm ơn câu hỏi và câu trả lời. –

Các vấn đề liên quan