2014-10-26 115 views
0

我想按日期排序表。問題是它們被解釋爲字符串,因此我的本地日期格式被錯誤排序,如26. September大於16. November,因爲26 > 16QSortFilterProxyModel按日期排序

無論如何,所以我有我自己的模型建立,並試圖像這樣:

QVariant MyModel::data(const QModelIndex &index, int role) const 
{ 
    if(role == Qt::UserRole) 
    { 
     if(index.column() == 5) // Date 
      return QSqlTableModel::data(index, role).toDate(); 
    } 

    if(role == Qt::DisplayRole) 
    { 
     if(index.column() == 5) // Date 
      return QSqlTableModel::data(index.role).toDate().toString("dd MMMM yyyy"); 
    } 
} 

,我設置sortRole這樣的:

proxyModel->setSortRole(Qt::UserRole); 

相應的線路實際上被調用,但現在我根本無法整理桌子。它只是沒有迴應。相應列處的箭頭(表示asc或desc排序)正在改變,但數據不是。 當然我設置的休息,如:

proxyModel->setDynamicSortFilter(true); 
proxyModel->setSourceModel(myDBModel); 
proxyModel->setFilterKeyColumn(1); 
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); 

如果我不設置sortRole至少我可以通過正確的另一列進行排序。 我在這裏做錯了什麼?我是否需要實現其他功能或其他功能?我看了看周圍的互聯網,但所有我發現是排序整數從幾年前,從來沒有日期:(

回答

2

我是個白癡(事實!)

的Qt已經提供了我所需要的,這只是在我身邊一個愚蠢的錯誤。兩件事,真的:

if(role == Qt::UserRole) 
    { 
     if(index.column() == 5) 
      return QDate::fromString(QSqlTableModel::data(index, Qt::DisplayRole).toString(), "yyyy-MM-dd"); // 1st Mistake, no correct conversion. I always got QVariant(invalid) 
// 1.1 Mistake, also, grab the data from Qt::DisplayRole, not from Qt::UserRole! 

     return QSqlTableModel::data(index, Qt::DisplayRole); // 2nd Mistake. Because I didn't add that line I couldn't sort it on any other column anymore. When I finally could sort it on the dates I couldn't on the other columns, then I thought about adding this line et voila! 
    } 

我想感謝您的友善和快速的答案,但這次椅子和鍵盤之間存在的問題。

1

問題我認爲你應該使用自定義排序/過濾器模型,你應該「教」類如何比較它。看看這個例子:http://doc.qt.io/qt-5/qtwidgets-itemviews-customsortfiltermodel-example.html

我想對你最有用的代碼,你可以在這裏找到:

bool MySortFilterProxyModel::lessThan(const QModelIndex &left, 
             const QModelIndex &right) const 
{ 
    QVariant leftData = sourceModel()->data(left); 
    QVariant rightData = sourceModel()->data(right); 

    if (leftData.type() == QVariant::DateTime) 
     return leftData.toDateTime() < rightData.toDateTime(); 
} 

QDateTime已經有了超負荷運營商<

1

根據QSortFilterProxyModel文檔,您可以提供自己的lessThan()實現。 http://doc.qt.io/qt-5/qsortfilterproxymodel.html#lessThan

如果出於某種原因無法按預期工作,如果使用ISO8601(YYYY-MM-DD)格式化日期,則始終可以將日期排序爲字符串。這是我通常選擇在處理數據庫時存儲(以及稍後排序)的日期。