0

我试图实现一个按此处描述的数字排序的新模型。

它看起来像这样:

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

4

2 回答 2

0

感谢另一个答案,我现在知道我的数据功能不完整。我没有手动处理所有可能的情况,而是询问了我的具体情况,然后调用了基类的数据函数。

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

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

    return QStandardItemModel::data(index, role);

}
于 2015-01-07T10:34:59.047 回答
0

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

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

您提供的答案不完整。您必须了解QStandardItemModel可以存储任何类型的数据,它可以是QString,它可以是intdouble(其他类型参见doc)。处理所有这些类型的默认比较方法,QSortFilterProxyModel所以问题是将字符串与数字进行比较,所以问题是确切QVariant存储的类型。链接答案尝试强制执行用于排序的统一类型,这个解决方案很差。

IMOQSortFilterProxyModel像这样子类化更安全:

bool MyUIntSortFilterProxyModel::lessThan(const QModelIndex & left, 
                                          const QModelIndex & right ) const {
    int cmpRole = sortRole();
    return left.data(cmpRole).toUInt()<right.data(cmpRole).toUInt();
}
于 2015-01-07T09:13:41.203 回答