Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1796|回复: 0
打印 上一主题 下一主题

Qt之QHeaderView排序

[复制链接]

1228

主题

1998

帖子

7598

积分

认证用户组

Rank: 5Rank: 5

积分
7598
跳转到指定楼层
楼主
发表于 2017-2-10 18:20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2017-2-10 18:33 编辑


Qt之QHeaderView排序
  1. QTableView *pTableView = new QTableView(this);
  2. TableModel *pModel = new TableModel(this);
  3. QSortFilterProxyModel *pProxyModel = new QSortFilterProxyModel(this);
  4. // 设置数据源模型
  5. pProxyModel->setSourceModel(pModel);
  6. pTableView->setModel(pProxyModel);
  7. // 设置可排序
  8. pTableView->setSortingEnabled(true);
  9. // 设置按照文件名升序排列
  10. pTableView->sortByColumn(FILE_NAME_COLUMN, Qt::AscendingOrder);

  11. // 构造数据,更新界面
  12. QList<FileRecord> recordList;

  13. // 获取随机值
  14. QTime time = QTime::currentTime();
  15. qsrand(time.msec() + time.second()*1000);

  16. for (int i = 0; i < 5; ++i)
  17. {
  18.     int nIndex = qrand()%20 + 1;
  19.     int nHour = qrand()%24;
  20.     int nMinute = qrand()%60;
  21.     int nSecond = qrand()%60;
  22.     int nBytes = qrand()%100000;

  23.     QDateTime dateTime(QDate(2016, 5, 1), QTime(nHour, nMinute, nSecond));

  24.     FileRecord record;
  25.     record.strFileName = QString("Name %1.cpp").arg(nIndex);
  26.     record.dateTime = dateTime;
  27.     record.nSize = nBytes;

  28.     recordList.append(record);
  29. }
  30. pModel->updateData(recordList);
复制代码
Qt之QHeaderView自定义排序(QSortFilterProxyModel)
  1. SortFilterProxyModel::SortFilterProxyModel(QWidget *parent)
  2.     : QSortFilterProxyModel(parent)
  3. {

  4. }

  5. SortFilterProxyModel::~SortFilterProxyModel()
  6. {

  7. }

  8. bool SortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
  9. {
  10.     if (!source_left.isValid() || !source_right.isValid())
  11.         return false;

  12.     if ((source_left.column() == FILE_NAME_COLUMN) && (source_right.column() == FILE_NAME_COLUMN))
  13.     {
  14.         QVariant leftData = sourceModel()->data(source_left);
  15.         QVariant rightData = sourceModel()->data(source_right);

  16.         if (leftData.canConvert<QString>() && rightData.canConvert<QString>())
  17.         {
  18.             QString strLeft = leftData.toString();
  19.             QString strRight = rightData.toString();

  20.             // 去掉后缀.cpp
  21.             if (strLeft.contains("."))
  22.             {
  23.                 int nIndex = strLeft.lastIndexOf(".");
  24.                 strLeft = strLeft.left(nIndex);
  25.             }
  26.             if (strRight.contains("."))
  27.             {
  28.                 int nIndex = strRight.lastIndexOf(".");
  29.                 strRight = strRight.left(nIndex);
  30.             }

  31.             // 比较大小,如果字符串相同,则比较后面的整形数据
  32.             QStringList strLeftList = strLeft.split(" ");
  33.             QStringList strRightList = strRight.split(" ");
  34.             if ((strLeftList.count() >= 2) && (strRightList.count() >= 2))
  35.             {
  36.                 int nResult = QString::compare(strLeftList.at(0), strRightList.at(0), Qt::CaseInsensitive);
  37.                 if (nResult == 0)
  38.                 {
  39.                     return strLeftList.at(1).toInt() < strRightList.at(1).toInt();
  40.                 }
  41.                 else
  42.                 {
  43.                     return nResult;
  44.                 }
  45.             }
  46.         }
  47.     }

  48.     return QSortFilterProxyModel::lessThan(source_left, source_right);
  49. }
复制代码
Qt之QHeaderView自定义排序(终极版)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-20 05:29 , Processed in 0.054365 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表