2017-09-21 127 views
1

我已經實現了一個自定義QSortFilterProxyModel排序QStandardItemModel。我已經覆蓋lessThan()函數,因爲我需要根據多個角色對其進行排序,而不僅僅是一個。例如,我按照優先級值對條目排序,而具有相同優先級的條目則按照它們的時間戳進一步排序。C++ - 更改自定義排序QSortFilterProxyModel

現在,如果我想按其他值排序,例如按字母順序排列的名稱值,我該怎麼辦?

我以爲我可以通過簡單地在每種不超過功能分離不同的情況下做到這一點:

bool MyProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const 
{ 
    if (sorting_by_priority) 
    { 
     // compare priority roles 
    } 
    else 
    { 
     // compare name roles 
    } 
} 

而且有我的開關排序功能做這樣的事情:

void MyProxyModel::switchSort(bool b) 
{ 
    sort_by_priority = b; 
    sort(0, Qt::AscendingOrder); 
} 

但這並不做任何事情(在調用這個函數後沒有任何東西被重新排序),所以顯然這不是正確的方法。 (是的,setDynamicSortFilter已啓用)

我已經通過創建兩個代理模型,一個按優先級排序,另一個按名稱,我只是在兩者之間切換。但我意識到這是一個非常不雅的解決方案,必須有更簡單的事情。但是由於我對Qt仍然很陌生,文檔有點令人難以置信,也許有人可以指引我朝着正確的方向發展?

+2

你試過[QSortFilterProxyModel ::無效] (http://doc.qt.io/qt-5/qsortfilterproxymodel.html#invalidate)? –

+0

我現在有,它的工作原理! –

回答

0

您應該致電QSortFilterProxyModel::invalidate指出當前排序失效,即應執行新的排序操作。

請注意,調用sort明確時dynamicSortFilter是假的或用戶指定的列或順序可以在代碼中可以看出還將努力:

void QSortFilterProxyModel::sort(int column, Qt::SortOrder order) 
{ 
    Q_D(QSortFilterProxyModel); 
    if (d->dynamic_sortfilter && d->proxy_sort_column == column && d->sort_order == order) 
     return; 
    d->sort_order = order; 
    d->proxy_sort_column = column; 
    d->update_source_sort_column(); 
    d->sort(); 
} 
+0

非常感謝! –