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

C++ 为模型定义新角色后程序崩溃,c++,qt,c++11,qt5.4,C++,Qt,C++11,Qt5.4,我试图实现一个新的模型,按照描述的数字排序 看起来是这样的: #ifndef NUMERICMODEL_H #define NUMERICMODEL_H #include <QStandardItemModel> class NumericModel : public QStandardItemModel { public: enum Role { SortRole=Qt::UserRole }; NumericModel() {}

我试图实现一个新的模型,按照描述的数字排序

看起来是这样的:

#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__;
我将排序角色设置为:

#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\u Moves->resizeColumnsToContents时崩溃。

为什么要转租QStandarItemModel? 这是不需要的,因为这个模型处理任何类型的角色!把它们放好

无论如何,您的实现会导致无限递归

你提供的答案不完整。您必须了解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);

}

在评论中,它说这将是低效的。你说我可以在不创建自己的类的情况下设置角色,如何设置?这是在不同的上下文中。如果您需要改进性能,那么您应该通过子类化QAbstractTableModel而不是QStandardItemModel来提供自己的模型,但这对您来说可能会很困难。多亏了您的提示,我提出了自己的解决方案。它现在适合我了。