Сбой программы после определения новой роли для модели

Я попытался реализовать новую модель, которая сортирует численно, как описано Вот.

Это выглядит так:

#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(),

0

Решение

почему вы субаренду 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();
}
0

Другие решения

Благодаря другой ответ Теперь я знаю, что моя функция данных была неполной. Вместо того чтобы вручную просматривать все возможные случаи, я просто попросил указать конкретный случай, а затем вызвал функцию данных базового класса.

QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const {

if (role == SortRole) {
return index.data().toUInt();
}

return QStandardItemModel::data(index, role);

}
0

По вопросам рекламы [email protected]