Я попытался реализовать новую модель, которая сортирует численно, как описано Вот.
Это выглядит так:
#ifndef NUMERICMODEL_H
#define NUMERICMODEL_H
#include <QStandardItemModel>
class NumericModel : public QStandardItemModel
{
public:
enum Role {
SortRole=Qt::UserRole
};
NumericModel() {}
~NumericModel() {}
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const {
switch ( role ) {
case Qt::DisplayRole:
return index.data().toString();
case SortRole:
return index.data().toUInt();
default:
return index.data().toString();
}
}
};
#endif // NUMERICMODEL_H
Я устанавливаю роль сортировки следующим образом:
QSortFilterProxyModel * proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(&m_movesModel);
proxyModel->setSortRole(NumericModel::SortRole);
qDebug() << __LINE__;
ui->tableView_Moves->setModel(proxyModel);qDebug() << __LINE__;
ui->tableView_Moves->resizeColumnsToContents();qDebug() << __LINE__;
Однако моя программа падает в последней строке при вызове ui->tableView_Moves->resizeColumnsToContents()
,
почему вы субаренду QStandardItemModel
?
Это не нужно, так как эта модель выполняет любые роли! Просто установите их.
В любом случае, ваша реализация приведет к бесконечной рекурсии!
Ответ, который вы предоставили, является неполным. Вы должны понимать, что QStandardItemModel
может хранить любые данные, это может быть QString
, может быть int
или же double
(и другие типы см. доктор). Метод сравнения по умолчанию для QSortFilterProxyModel
обрабатывает все эти типы, поэтому проблема состоит в сравнении строк с числами, поэтому проблема заключается в том, какой тип QVariant
магазины. Связанный ответ пытается навязать единый тип, используемый для сортировки, и это решение довольно плохое.
ИМО подкласс безопаснее QSortFilterProxyModel
как это:
bool MyUIntSortFilterProxyModel::lessThan(const QModelIndex & left,
const QModelIndex & right ) const {
int cmpRole = sortRole();
return left.data(cmpRole).toUInt()<right.data(cmpRole).toUInt();
}
Благодаря другой ответ Теперь я знаю, что моя функция данных была неполной. Вместо того чтобы вручную просматривать все возможные случаи, я просто попросил указать конкретный случай, а затем вызвал функцию данных базового класса.
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const {
if (role == SortRole) {
return index.data().toUInt();
}
return QStandardItemModel::data(index, role);
}