2013-01-07 24 views
8

Tôi cần triển khai bảng có Qt.Cách đặt dữ liệu bên trong QAbstractTableModel

Tôi tin rằng tôi sẽ kiện một QAbstractTableModel, với QTableView sử dụng mô hình này.

Tôi hiểu rằng tôi sẽ phải chỉnh sửa các hàm rowCount(), columnCount() và data() của mô hình.

Tuy nhiên, tôi không hiểu làm thế nào để chính xác thiết lập các dữ liệu bên trong các mô hình, do đó dữ liệu() chức năng có thể lấy nó ..

Là SetData() chức năng được cung cấp cho mục đích này? Tôi đã nhìn thấy nó có EditRole như tham số của nó, mà tôi không muốn, vì tôi không muốn bảng của tôi có thể chỉnh sửa được.

Vì vậy, làm cách nào để "đặt" dữ liệu bên trong mô hình hoặc có dữ liệu để mô hình tiếp cận, sử dụng hàm data()?

Ngoài ra, hàm data() được gọi như thế nào, tức là ai gọi nó và nó sẽ được gọi ở đâu?

Hãy giúp tôi với điều này.

Cảm ơn.

+2

[This] (http://qt-project.org/doc/qt-4.8/itemviews-addressbook.html) là một ví dụ. –

+0

Cảm ơn vì điều đó. Giúp rất nhiều. – user1173240

Trả lời

14

Cách dữ liệu thực được lưu trong bộ nhớ, được tạo hoặc truy vấn từ kho dữ liệu hoàn toàn tùy thuộc vào bạn. Nếu đó là dữ liệu tĩnh, bạn có thể sử dụng các cấu trúc dữ liệu tùy chỉnh Qt container classes.

Bạn chỉ cần triển khai lại phương thức setData() cho các mô hình có thể chỉnh sửa.

Có 4 phương pháp bạn cần phải thực hiện trong một QAbstractTableModel lớp con không thể chỉnh sửa:

  • int rowCount()
  • int columnCount()
  • QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole)
  • QVariant data(const QModelIndex & index, int role = Qt::DisplayRole)

Những phương pháp này được gọi là từ chế độ xem, thường là QTableView ví dụ. Hai phương thức đầu tiên sẽ trả về kích thước của bảng. Ví dụ: nếu rowCount() trả lại 10columnCount() trả về 4, chế độ xem sẽ gọi phương thức data() 40 lần (một lần cho mỗi ô) yêu cầu dữ liệu thực trong cấu trúc dữ liệu nội bộ của mô hình của bạn.

Ví dụ: giả sử bạn đã triển khai một vùng tùy chỉnh retrieveDataFromMarsCuriosity() trong mô hình của mình. Khe cắm này điền vào một cấu trúc dữ liệu và được kết nối với một cá thể QPushButton, do đó bạn có được dữ liệu mới bằng cách nhấp vào một nút. Bây giờ, bạn cần phải cho chế độ xem biết khi dữ liệu đang được thay đổi để dữ liệu có thể cập nhật đúng cách. Đó là lý do tại sao bạn cần phải phát ra beginRemoveRows(), endRemoveRows(), beginInsertRows(), endInsertRows() và các đối tác cột của nó.

Qt Documentation có mọi thứ bạn cần biết về điều này.

+0

Cảm ơn bạn rất nhiều vì đã trợ giúp nhanh chóng. Tôi chắc chắn sẽ xem xét nó. – user1173240

+0

@dschulz, là nó hoàn toàn cần thiết để sử dụng beginInsertRows(), vv cho initialisation đầu tiên? Sau đó, tôi không hiểu mục đích của dataChanged(). Tại sao Qt không thể lấy thông tin chỉ bằng rowCount(), columnCount() & data()? Tại sao có nhu cầu tạo hàng và cột bằng cách sử dụng beginInsertRows(), v.v ...? –

+0

@Cool_Coder có, nó là cần thiết nếu bạn reimplement 'insertRows()'. Bạn phải gọi 'beginInsertRows()' trước khi thêm các mục vào thùng chứa dữ liệu của mô hình của bạn (có thể là một 'QList' hoặc bất kỳ lớp chứa nào bạn sử dụng). Lưu ý rằng "dữ liệu đã thay đổi" không nhất thiết ngụ ý rằng các hàng hoặc cột đang được thêm vào hoặc bị xóa. 'dataChanged()' có nghĩa là dữ liệu trong các mục _existing_ trong mô hình đã được cập nhật, do đó, khung nhìn có thể truy xuất dữ liệu đã cập nhật đó. Chỉ cần suy nghĩ về những gì sẽ xảy ra khi bạn sửa tên của mình trong ô 'QTableView' có thể chỉnh sửa. – dschulz

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