2012-01-24 38 views
5

Tôi có cấu trúc dữ liệu tùy chỉnh mà tôi muốn hiển thị trong ứng dụng PyQt bằng QTableView. Tôi đang sử dụng một phân lớp của QAbstractTableModel để giao tiếp với dữ liệu. Bản thân cấu trúc dữ liệu nằm trong một mô-đun riêng biệt và không biết gì về PyQt.Làm thế nào để cập nhật QAbstractTableModel và QTableView sau khi sắp xếp nguồn dữ liệu?

Hiển thị và chỉnh sửa dữ liệu bằng QTableView hoạt động, nhưng bây giờ tôi muốn sắp xếp dữ liệu và sau đó cập nhật mô hình và chế độ xem.

Sau khi đọc các tài liệu Qt cho QAbstractTableModel và tổ tiên của nó QAbstractItemModel, cách tiếp cận đầu tiên của tôi là cố gắng này:

class MyModel(QtCore.QAbstractTableModel): 
    __init__(self, data_structure): 
     super().__init__() 
     self.data_structure = data_structure 

    # ... 

    def sort_function(self): 
     self.layoutAboutToBeChanged.emit() 
     # custom_sort() is built into the data structure 
     self.data_structure.custom_sort() 
     self.layoutChanged.emit() 

Tuy nhiên, đây không phải cập nhật xem. Tôi cũng đã cố gắng phát ra một tín hiệu dataChanged trên tất cả các dữ liệu đang được sử dụng bởi mô hình, nhưng điều này không thể cập nhật xem là tốt.

Tôi đã nghiên cứu thêm. Nếu tôi hiểu chính xác, vấn đề là QPersistentModelIndexes trong mô hình không được cập nhật, và giải pháp sẽ là cập nhật bằng tay bằng cách nào đó.

Có cách nào tốt hơn để thực hiện việc này không? Nếu không, làm thế nào tôi sẽ đi về việc cập nhật chúng (tốt nhất là không cần phải viết một chức năng sắp xếp mới theo dõi mọi thay đổi chỉ mục)?

+0

Mã của bạn * nên * hoạt động và bạn * không * cần phải lo lắng về chỉ mục liên tục tại đây. Tôi đã viết các mô hình phát ra các tín hiệu tương tự như 'sort_function' của bạn và cập nhật chính xác các khung nhìn. Bạn có chắc chắn rằng hàm của bạn được gọi, 'custom_sort()' thực sự thay đổi dữ liệu và các thay đổi này được phản ánh bằng phương thức 'data()' của mô hình của bạn? –

+0

@FerdinandBeyer Ahh, đó là vấn đề! Tôi đã kiểm tra rằng dữ liệu đã được thay đổi, nhưng không nghĩ rằng để kiểm tra dữ liệu() phương pháp riêng của mình. custom_sort() đang sao chép một số mục cần thiết để sắp xếp tại chỗ. Cảm ơn nhiều! –

+0

Không sao cả. Cảm thấy tự do để gửi giải pháp của bạn như là một câu trả lời, và chấp nhận nó, để câu hỏi này sẽ được đánh dấu là đã trả lời! –

Trả lời

3

Đã xảy ra lỗi trong hàm custom_sort(). Sau khi sửa chữa nó, cách tiếp cận tôi mô tả ở đây hoạt động.

class MyModel(QtCore.QAbstractTableModel): 
    __init__(self, data_structure): 
     super().__init__() 
     self.data_structure = data_structure 

    # ... 

    def sort_function(self): 
     self.layoutAboutToBeChanged.emit() 
     # custom_sort() is built into the data structure 
     self.data_structure.custom_sort() 
     self.layoutChanged.emit() 
Các vấn đề liên quan