1、通常情况下,我们都是对QTableView的Item的text进行排序的(Qt::DisplayRole),实际上还可以对其他内容进行排序(参考enum Qt::ItemDataRole)
2、默认情况下,Item的排序是按照字符串的方式来排序的,这就是为什么我们看到排序结果类似于: ("100","20","3","400")。
3、通过追看QT(4.6.1)的源代码,发现QTableView的排序函数sortByColumn根源在QAbstractItemModel,但其中的排序函数什么都没做,实际上还是在"QStandardItemModel::sort(int column, Qt::SortOrder order)"中实现的,排序函数有依赖于 "bool QStandardItem::operator<(const QStandardItem &other) const"。上面引号中内容都在"/qt-everywhere-opensource-src-4.6.1/src/gui/itemviewsqstandarditemmodel.cpp"中。 如下:
4、实际上我们要做的就是,继承QStandardItem并重载operator<,下面是我的实现,根据需要还得重载拷贝构造函数和operator=。
我的目的是,让第1列到第15列之间的item按照double的值大小来排序。
5、修改item时,使用下面的方式,还得稍作改变(dynamic_cast),可能还有更优雅的方式。
QuoteItem *oldItem = dynamic_cast<QuoteItem*>(model->item(row, column));