QSortFilterProxyModel 对任意列进行排序方法

  • 从 SDK examples 学习来的方法

    • 使用 setRole,设置需要排列的列
    • 使用 sort 方法,进行排序

    使用以上方法,发现只能对第一次 setRole 的列起作用,再切换其它列就不管用了。

  • stackoverflow 学习的方法
    • 重载 lessThan 方法

      bool SortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
      {
          QVariant left = sourceModel()->data(source_left, m_sortRole);
          QVariant right = sourceModel()->data(source_right, m_sortRole);
          return left.toString() < right.toString();
      }   
      
    • 在代码中保存列并排序 m_sortRole

      void SortFilterProxyModel::sortColumn(int column, Qt::SortOrder order)
      {
          m_sortRole = column + LogListModel::NameRole;
          sort(0, order);
      }   
      
    • qml 中响应 TableView 列排序事件

      tableView.onSortIndicatorColumnChanged: {
          logProxyModel.sortColumn(tableView.sortIndicatorColumn, tableView.sortIndicatorOrder)
      }
      tableView.onSortIndicatorOrderChanged: {
          logProxyModel.sortColumn(tableView.sortIndicatorColumn, tableView.sortIndicatorOrder)
      }