2012-07-23 56 views
14

Tôi đang sử dụng QTableView để hiển thị một QAbstractTableModel:Cách sắp xếp một QTableView theo một cột?

#include <QtGui/QApplication> 
#include <QAbstractTableModel> 
#include <QTableView> 

class TestModel : public QAbstractTableModel 
{ 
public: 
    int rowCount(const QModelIndex &parent = QModelIndex()) const 
    { 
     return 2; 
    } 
    int columnCount(const QModelIndex &parent = QModelIndex()) const 
    { 
     return 2; 
    } 
    QVariant data(const QModelIndex &index, int role) const 
    { 
     switch (role) 
     { 
     case Qt::DisplayRole: 
     { 
      return 4 - index.row() + index.column(); 
     } 
     } 
     return QVariant(); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QTableView table; 
    TestModel model; 
    table.setModel(&model); 
    table.setSortingEnabled(true); 
    table.sortByColumn(0, Qt::AscendingOrder); 
    table.reset(); 
    table.show(); 

    return a.exec(); 
} 

The displayed widget

Vấn đề là kết quả là giống hệt nhau khi tôi sử dụng:

table.sortByColumn(0, Qt::AscendingOrder); 

hoặc

table.sortByColumn(0, Qt::DescendingOrder); 

hoặc

table.sortByColumn(1, Qt::AscendingOrder); 

hoặc

table.sortByColumn(1, Qt::DescendingOrder); 

Tôi đang làm gì sai?

Trả lời

14

QAbstractTableModel cung cấp triển khai sort() trống.

Hãy thử làm

TestModel model; 
QSortFilterProxyModel proxyModel; 
proxyModel.setSourceModel(&model); 
table.setModel(&proxyModel); 
+0

Cảm ơn bạn! Nó hoạt động! Nhưng tôi đã làm gì sai? Tại sao mã của tôi không hoạt động? Tôi đã đọc tài liệu của cả QTableView và QAbstractTableModel lên và xuống, nhưng không tìm hiểu tại sao. –

+0

Nếu tôi hiểu điều này một cách chính xác, QTableView chỉ cần gọi hàm sắp xếp rỗng() của QAbstractTableModel? Nó không tự làm gì? –

+1

Có chính xác. QSqlTableModel hiện có một iirc sắp xếp sắp xếp, do đó, sắp xếp hoạt động ở đó mà không có mô hình proxy. Tuy nhiên, khi bạn đang sử dụng một mô hình riêng, bạn cần một QSortFilterProxyModel mà - như tên cho thấy - không có một thực hiện phân loại là tốt. –

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