Qt:在数字字符串上使用QSortFilterProxyModel并获取错误的列文本时排序错误

时间:2011-07-04 06:45:29

标签: qt sorting qtreeview

我有简单的模型视图树视图,QSortFilterProxyModel代理用于对列进行排序,QStandardItemModel用作模型
在每一列中都有一个字符串可以很好地排序,但是在包含数字(作为字符串)的列中排序错误 说我有9,12,1(每个数字在不同的列,当我对它们进行排序时我得到1,12,9或12,1,9但从未按正确的顺序排列。 像1,9,12或12,9,1为什么?
另外我注意到当我逐列排序时,当我尝试使用m_model->item(iSelectedRow,0)->text();来获取新列文本时 即时通讯获取初始列文本但从未获取新的排序列文本。为什么?

3 个答案:

答案 0 :(得分:12)

这是因为默认情况下,QSortFilterProxyModel按DisplayRole排序。如果返回一个字符串,它将对字符串进行排序。 要使模型按其他值排序,请在源模型中定义自定义排序角色并将其设置在代理上:

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 );

你的第二个问题:什么是m_model?源模型,还是sortfilterproxymodel?前者永远不会通过排序来改变,排序只发生在代理中。

答案 1 :(得分:3)

如果您对字符串“9”,“12”和“1”进行排序,您将获得“1”,“12”,“9”(词典排序)。如果你希望它们按数字排序,你必须继承QSortFilterProxyModel并重新实现lessThan成员函数,你可以只使用QString :: toInt()。

你可以通过研究优秀的Qt documentation找到所有这些,你也可以在其中找到有关mapToSource(),mapFromSource(),mapSelectionToSource()和mapSelectionFromSource()的信息,以将源QModelIndex转换为已排序/已过滤模型索引,反之亦然。

答案 2 :(得分:1)

在填充表时使用QStandardItem :: setData(),如下所示。然后一切都会按预期工作。

以下Qt文档中的行

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

以下是设定数据的简单用法。

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