2015-01-07 51 views
0

我試圖實現一個按照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

你爲什麼要轉租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(); 
} 
+0

在[本](http://stackoverflow.com/questions/6568161/qt-sorting-is-wrong-when-using-qsortfilterproxymodel-on-number-strings-and-gett#comment7744654_6569116)評論它說這會是低效的。 你說我可以在沒有創建自己的類的情況下設置一個角色,怎麼樣? – gartenriese

+0

這是在不同的情況下。如果你提高了性能,那麼你應該通過繼承'QAbstractTableModel'而不是'QStandardItemModel'來提供自己的模型,但是可能會對你很難。 –

+0

感謝您的提示,我想出了自己的解決方案。現在它適用於我。 – gartenriese

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); 

}