Tôi đang làm việc trên một ứng dụng bản đồ và cần hiển thị các đối tượng dữ liệu bằng cách sử dụng bảng, biểu mẫu và các đối tượng đồ họa trong bản đồ. Tôi đang sử dụng PyQt, nhưng điều đó không thực sự quan trọng vì đây là một câu hỏi Qt không phải là một câu hỏi Python.Cách sử dụng khung công tác Qt Model/View với khung nhìn Graphics View
Nếu tôi chỉ cần xem bảng và dạng biểu mẫu thì điều này sẽ dễ dàng, tôi chỉ sử dụng khung công tác Mô hình/Chế độ xem. Tuy nhiên, tôi cần chế độ xem bản đồ để cung cấp chức năng chỉ thực sự có sẵn bằng cách sử dụng khung công cụ Khung nhìn đồ họa, về cơ bản đó là khung công tác Model/View của riêng nó với QGraphicsScene hoạt động như mô hình dữ liệu.
Tôi có thể nghĩ ra hai cách để thực hiện việc này. Một là bắt đầu với một mô hình có thẩm quyền được phân lớp từ QAbstractItemModel, liên kết nó với một lớp con của QAbstractItemView và từ đó tạo ra và cập nhật QGraphicsItems trong khung cảnh. Điều này có vẻ xấu xí mặc dù vì tôi không chắc chắn cách xử lý tương tác người dùng và thay đổi các mục dữ liệu mặc dù tương tác với QGraphicsItems.
Cách khác tôi có thể nghĩ là làm điều đó với QGraphicsScene là nguồn dữ liệu có thẩm quyền, lưu trữ đối tượng dữ liệu trong mỗi thuộc tính .data() của QGraphicsItem. Sau đó tôi sẽ phân lớp QAbstractItemModel và viết nó để nó truy cập dữ liệu trong khung làm lưu trữ dữ liệu, các khung nhìn khác sau đó sẽ sử dụng nó làm mô hình của chúng. Làm thế nào tôi sẽ tuyên truyền những thay đổi đối với dữ liệu trong cảnh lên đến mô hình mặc dù?
Cách tiếp cận nào tôi thực hiện, có vẻ như có một khoảng trống không được xử lý bởi các khung công tác. Trong mô hình/Xem tất cả các thay đổi được giả định là được thực hiện trong mô hình. Trong đồ họa Xem tất cả các thay đổi được giả định là được thực hiện trong cảnh.
Vậy cách tiếp cận nào bạn sẽ chọn QAbstractItemModel (có thẩm quyền) -> QAbstractItemView-> QGraphicsScene hoặc cách khác QGraphicsScene (độc quyền) -> QAbstractItemModel-> Các chế độ xem khác. Tại sao bạn lại chọn cái này hơn cái kia và bạn đoán trước điều gì? Có ai khác cần phải thu hẹp khoảng cách này giữa khung mô hình/khung nhìn đôi của Qt và bạn đã làm như thế nào?
Đây là cách tiếp cận mà tôi đã bắt đầu, trước khi tôi nhận ra mình có thể làm theo cách khác. Tôi đoán các phương pháp duy nhất của AQbstractItemView tôi cần phải phân lớp là dataChanged(), rowsInserted() và rowsAboutToBeRemoved()? Sau đó quản lý các mục trong cảnh một cách thích hợp. Tôi hy vọng tôi sẽ lưu trữ QPersistentModelIndexes trong QGraphicsItems. Tôi thích ý tưởng QHash. Tôi đang sử dụng PyQT vì vậy tôi muốn sử dụng một từ điển Python, nhưng nó là một tối ưu hóa tốt đẹp một trong hai cách. –
@Simon: Yep Tôi nghĩ rằng bạn đã có nó, trong dataChanged() bạn có thể phải sao chép một số mã từ QGraphicsScene tùy thuộc vào dữ liệu và biểu diễn của bạn, nhưng một lần nữa, nó sẽ là nhỏ nếu có. –
Làm việc ở mức cơ bản. Yay! –