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

标签 qt sorting qtreeview

我有简单的模型 View TreeView ,带有 QSortFilterProxyModel 代理来对列进行排序,并使用 QStandardItemModel 作为模型
在每列中都有字符串排序良好,但在包含数字(作为字符串)的列中排序错误。
假设我有 9,12,1(当我对它们进行排序时,不同列中的每个数字我得到 1,12,9 或 12,1,9,但顺序从来都不是正确的。 像 1,9,12 或 12,9,1 为什么?
我还注意到,当我按列排序时,当我尝试使用 m_model->item(iSelectedRow,0)->text();
获取新列文本时 我得到了初始列文本,但没有得到新的排序列文本。为什么?

最佳答案

这是因为默认情况下,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是什么?源模型,还是 sortfilterproxy 模型?前者不会因排序而改变,排序仅发生在代理中。

关于Qt:在数字字符串上使用 QSortFilterProxyModel 并获取错误的列文本时排序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6568161/

相关文章:

php - glob() — 按名称排序

arrays - 替换排序数组中偶数位置的数字

qt - 如何获得 QTreeView 的大小/深度/分支?

qt - 如何恢复 QTreeView 最后展开的状态?

c++ - QT窗口中DirectX11渲染不丢失其他widgets

c++ - 无法加载 QML 插件 : cannot protect module as it was never registered

c++ - QT中如何将图表保存为图片

Qt Widget 暂时全屏

Javascript - 如何混合具有特定排序顺序的两个对象数组?

python - PyQt Tree Widget,为动态移除添加复选框