简述

对以上节的排序,我们衍伸了两点:

  1. 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较。
  2. 将整形显示为字符串,而排序依然正常呢。

为了分别描述,这里我们先解决问题1。

效果

处理大小显示

// 定义GB、MB、KB的计算常量
const int GB = 1024 * 1024 * 1024;
const int MB = 1024 * 1024;
const int KB = 1024; QString bytesToGBMBKB(qint64 size)
{
if (size / GB >= 1)
return QString("%1 GB").arg(QString::number(size / (float)GB, 'f', 2));
else if (size / MB >= 1)
return QString("%1 MB").arg(QString::number(size / (float)MB, 'f', 2));
else if (size / KB >= 1)
return QString("%1 KB").arg(QString::number(size / (float)KB, 'f', 2));
else
return QString("%1 Bytes").arg(size);
}

QAbstractTableModel

这里只修改了一行代码,其它代码和上节相同。

// 表格项数据
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant(); int nRow = index.row();
int nColumn = index.column();
FileRecord record = m_recordList.at(nRow); switch (role)
{
case Qt::TextColorRole:
return QColor(Qt::white);
case Qt::TextAlignmentRole:
return QVariant(Qt::AlignLeft | Qt::AlignVCenter);
case Qt::DisplayRole:
{
if (nColumn == FILE_NAME_COLUMN)
{
return record.strFileName;
}
else if (nColumn == DATE_TIME_COLUMN)
{
return record.dateTime;
}
else if (nColumn == FILE_SIZE_COLUMN)
{
// 之前返回的qint64,现在转换为字符串
return bytesToGBMBKB(record.nSize);
} return "";
}
default:
return QVariant();
} return QVariant();
}

QSortFilterProxyModel

QSortFilterProxyModel是用来排序和过滤的,不能单独使用,它只是一个“代理”,真正的数据需要QAbstractTableModel提供,可以重写lessThan来实现自己的排序算法。

SortFilterProxyModel::SortFilterProxyModel(QWidget *parent)
: QSortFilterProxyModel(parent)
{ } SortFilterProxyModel::~SortFilterProxyModel()
{ } bool SortFilterProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
if (!source_left.isValid() || !source_right.isValid())
return false; if ((source_left.column() == FILE_NAME_COLUMN) && (source_right.column() == FILE_NAME_COLUMN))
{
QVariant leftData = sourceModel()->data(source_left);
QVariant rightData = sourceModel()->data(source_right); if (leftData.canConvert<QString>() && rightData.canConvert<QString>())
{
QString strLeft = leftData.toString();
QString strRight = rightData.toString(); // 去掉后缀.cpp
if (strLeft.contains("."))
{
int nIndex = strLeft.lastIndexOf(".");
strLeft = strLeft.left(nIndex);
}
if (strRight.contains("."))
{
int nIndex = strRight.lastIndexOf(".");
strRight = strRight.left(nIndex);
} // 比较大小,如果字符串相同,则比较后面的整形数据
QStringList strLeftList = strLeft.split(" ");
QStringList strRightList = strRight.split(" ");
if ((strLeftList.count() >= 2) && (strRightList.count() >= 2))
{
int nResult = QString::compare(strLeftList.at(0), strRightList.at(0), Qt::CaseInsensitive);
if (nResult == 0)
{
return strLeftList.at(1).toInt() < strRightList.at(1).toInt();
}
else
{
return nResult;
}
}
}
} return QSortFilterProxyModel::lessThan(source_left, source_right);
}

提示

效果图中,只针对名称自定义排序了,大小只进行了转换,还尚未排序,因为存在多种解决方案,下节我会将方案一一列出,然后进行对比。

Qt之QHeaderView自定义排序(QSortFilterProxyModel)的更多相关文章

  1. Qt之QHeaderView自定义排序(终极版)

    简述 本节主要解决自定义排序衍生的第二个问题-将整形显示为字符串,而排序依然正常. 下面我们介绍三种方案: 委托绘制 用户数据 辅助列 很多人也许会有疑虑,平时都用delegate来绘制各种按钮.图标 ...

  2. Qt之QHeaderView自定义排序(获取正确的QModelIndex)

    简述 前几节中分享过关于自定义排序的功能,貌似我们之前的内容已经可以很好地解决排序问题了,但是,会由此引发一些很难发现的问题...比如:获取QModelIndex索引错误. 下面,我们先来实现一个整行 ...

  3. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  4. DataTable自定义排序

    使用JQ DataTable 的时候,希望某列数据可以进行自定义排序,操作如下:(以中文排序和百分比排序为例) 1:定义排序类型: //百分率排序 jQuery.fn.dataTableExt.oSo ...

  5. 干货之UICollectionViewFlowLayout自定义排序和拖拽手势

    使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...

  6. DataGridView 绑定List集合后实现自定义排序

    这里只贴主要代码,dataList是已添加数据的全局变量,绑定数据源 datagridview1.DataSource = dataList,以下是核心代码. 实现点击列表头实现自定义排序 priva ...

  7. 【转】c++中Vector等STL容器的自定义排序

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1. ...

  8. mysql如何用order by 自定义排序

    mysql如何用order by 自定义排序 id name roleId aaa bbb ccc ddd eee ,MySQL可以通过field()函数自定义排序,格式:field(value,st ...

  9. python 自定义排序函数

    自定义排序函数 Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 ...

随机推荐

  1. WPF 验证

    WPF中TextBox的自动验证: 演示 : 用以下两个TextBox分别显示验证IP和非空值验证,先看效果: IP自动验证效果: 非空值自动验证效果: 第一步:定义TextBox验证的样式: < ...

  2. uitableviewcell 和 uibutton

    如果cell上面只有一个button  可以设置button.tag=IndexPath.Row;得到当前点击的行数,设置button属性的时候,可以设置一个全局的button来记住当前点击的butt ...

  3. C#与C++之间类型的对应{转}

    Windows Data Type   .NET Data Type BOOL, BOOLEAN   Boolean or Int32 BSTR    String BYTE    Byte CHAR ...

  4. DirectShow学习笔记

    DirectShow, as you might have guessed, is a COM based multimedia framework that makes the task of ca ...

  5. jquery offset() 与position()方法的区别

    jquery 中有两个获取元素位置的方法offset()和position(),这两个方法之间有什么异同?使用的时候应该注意哪些问题?什么时候使用offset(),什么时候又使用position()呢 ...

  6. acdream1116 Gao the string!(扩展KMP)

    今天是字符串填坑的一天,首先填的第一个坑是扩展KMP.总结一下KMP和扩展KMP的区别. 在这里s是主串,t是模式串. KMP可以求出的是以s[i]为结尾的串和 t前缀匹配的最长的长度.假如这个长度是 ...

  7. IOS第三方地图-百度地图集成

    百度地图官网: http://developer.baidu.com/map/index.php?title=iossdk 照上面吧百度地图sdk集成到工程 然后在pilst文件中加入: 如果地图没有 ...

  8. C++ 第一次上机作业

    今天完成了C++第一次上机作业,感觉比较简单. 题目: 求2个数或3个正整数中的最大数,用带有默认参数的函数实现. 对3个变量按由小到大顺序排序,要求使用变量的引用. 编写一个程序,用同一个函数名对几 ...

  9. Qt之界面出现、消失动画效果(简单好用)

    在学习Qt的这2.3个月里,对Qt越发感兴趣,从刚开始的盲目.无所适从到现在的学习.研究.熟练.掌握的过程中,我学到了很多东西,也学会了如何通过自学让自己更加成熟.强大起来,如何更有效地提高自己学习. ...

  10. Mysql Workbench 学习

    1.安装 http://dev.mysql.com/downloads/tools/workbench/ 选择合适的,下载(以Ubuntu 为例) cd到下载目录,然后sudo dpkg -i wor ...