基本上继承QSortFilterProxyModel 并实现lessThan。
另外,如果您使用单独的模型角色来存储实际大小(以字节为单位)而不是转换显示的值会更好。在这种情况下,比较方法类似于
class MySortFilterProxyModel : public QSortFilterProxyModel
{
public:
MySortFilterProxyModel(QObject *parent = 0);
protected:
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override {
const auto left_bytes = left.data(SIZE_IN_BYTES_ROLE).toULongLong();
const auto right_bytes = right.data(SIZE_IN_BYTES_ROLE).toULongLong();
return left_bytes < right_bytes;
}
};
如果出于任何原因,您仍然使用显示角色,您应该从索引中获取文本并将字符串转换为字节,然后再进行比较。对于转换函数,您有多种选择,例如将字符串拆分为数字和单位,然后使用查找表获得单位的乘数。
class MySortFilterProxyModel : public QSortFilterProxyModel
{
public:
MySortFilterProxyModel(QObject *parent = 0);
protected:
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override {
const auto left_bytes = toBytes(left.data().toString());
const auto right_bytes = toBytes(right.data().toString());
return left_bytes < right_bytes;
}
private:
static int64_t toBytes(const QString& size)
{
static const QMap<QString, int64_t> s_sizes = {
{"b", 1},
{"kb", 1024},
{"mb", 1024 * 1024},
{"gb", 1024 * 1024 * 1204},
{"tb", 1024 * 1024 * 1204 * 1024},
};
const auto tokens = size.toLower().split(' ', QString::SkipEmptyParts);
if (tokens.size() == 0) return 0; // error
const auto number = tokens[0].toInt();
if (tokens.size() == 1) return number; // assume bytes
return number * s_sizes.value(tokens[1], 0); // 0 for unknown units
}
};
您可以查看更完整的示例,了解如何继承 QSortFilterProxyModel here。