为模型定义新角色后程序崩溃

Program crashes after defining new role for model

本文关键字:程序 崩溃 角色 模型 定义 新角色      更新时间:2023-10-16

我尝试实现一个新模型,该模型按此处所述按数字排序。

它看起来像这样:

#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,它可以是intdouble(其他类型的请参阅文档)。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();
}

多亏了另一个答案,我现在知道我的数据函数不完整。我没有手动浏览所有可能的情况,我只是询问我的具体情况,然后调用基类的数据函数。

QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const {
    if (role == SortRole) {
        return index.data().toUInt();
    }
    return QStandardItemModel::data(index, role);
}