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

时间:2015-01-07 08:26:00

标签: c++ qt c++11 qt5.4

我试图实现一个按照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()时,我的程序在最后一行崩溃。

2 个答案:

答案 0 :(得分:0)

为什么要转租QStandardItemModel? 这不是必需的,因为这个模型可以处理任何类型的角色!只需设置它们。

无论如何,你的实现会导致不定式的递归!

您提供的答案不完整。您必须了解QStandardItemModel可以存储QString的任何类型的数据,可以是intdouble(其他类型请参见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);

}