Qt: Sorting is wrong when using QSortFilterProxyModel on number strings and getting wrong column text

六月ゝ 毕业季﹏ 提交于 2019-12-30 07:14:09

问题


i have simple model view treeview with QSortFilterProxyModel proxy to sort the columns and QStandardItemModel as the model
in each columns there are string that gets sorted fine but in columns that contains number ( as strings ) the sorting wrong .
say i have 9,12,1 (each number in different column when i sort them im getting 1,12,9 or 12,1,9 but never in the right order . like 1,9,12 or 12,9,1 why ?
also i notice that when i sort row by column , when i try to get the new column text with m_model->item(iSelectedRow,0)->text();
im getting the initial column text but never the new sorted column text. why ?


回答1:


That's because by default, QSortFilterProxyModel sorts by DisplayRole. If that returns a string, it will sort the string. To have the model sort by some other value, define a custom sort role in the source model and set it on the proxy:

class MyModel {
   ...
   enum Role {
      SortRole=Qt::UserRole
   };
   QVariant data( ... ) const {
       ...
       switch ( role ) {
       case Qt::DisplayRole:
           return value as string;
       case SortRole:
           return value as int;
       }
   }
};

...
sortfilterproxy->setSortRole( MyModel::SortRole );

Your second question: What is m_model? The source model, or the sortfilterproxymodel? The former is never changed by sorting, the sorting happens only in the proxy.




回答2:


If you sort the strings "9", "12" and "1" you will get "1", "12", "9" (lexicographic sorting). If you want them sorted as numbers, you have to subclass the QSortFilterProxyModel and reimplement the lessThan member function where you could just use QString::toInt().

You can find out all of this by studying the excelent Qt documentation, where you also find information about mapToSource(), mapFromSource(), mapSelectionToSource(), and mapSelectionFromSource() to convert source QModelIndexes to sorted/filtered model indexes or vice versa.




回答3:


use QStandardItem::setData() when filling your table as shown below. Then all will work as expected.

below lines from Qt documentation

virtual void QStandardItem::setData(const QVariant & value, int role = Qt::UserRole + 1)

Here is simple usage of set data.

item->setData(intData, Qt::DisplayRole);


来源:https://stackoverflow.com/questions/6568161/qt-sorting-is-wrong-when-using-qsortfilterproxymodel-on-number-strings-and-gett

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!