我试图实现一个按照here描述的数字排序的新模型。
看起来像这样:
#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 :(得分:0)
为什么要转租QStandardItemModel
?
这不是必需的,因为这个模型可以处理任何类型的角色!只需设置它们。
无论如何,你的实现会导致不定式的递归!
您提供的答案不完整。您必须了解QStandardItemModel
可以存储QString
的任何类型的数据,可以是int
或double
(其他类型请参见doc) 。 QSortFilterProxyModel
的默认比较方法处理所有这些类型,因此问题是将字符串与数字进行比较,因此问题是QVariant
存储的类型。链接的答案尝试强制执行用于排序的统一类型,这种解决方案很差。
IMO将QSortFilterProxyModel
这样的子类化更安全:
bool MyUIntSortFilterProxyModel::lessThan(const QModelIndex & left,
const QModelIndex & right ) const {
int cmpRole = sortRole();
return left.data(cmpRole).toUInt()<right.data(cmpRole).toUInt();
}
答案 1 :(得分:0)
感谢other answer我现在知道我的数据功能不完整。我没有手动完成所有可能的情况,只是询问了我的具体情况,然后调用了基类的数据函数。
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const {
if (role == SortRole) {
return index.data().toUInt();
}
return QStandardItemModel::data(index, role);
}