我有一个QTableWidget
,第一列包含从1到1000的数字。现在我需要根据第一列对表进行排序。
我使用的是函数sortItems(int column, Qt::AscendingOrder)
,但它显示为:
1,10,100,1000,101,102,...
然而,我需要这样的结果:
1,2,3 ,4....,1000。
我使用CSV文件来填充表。
发布于 2011-10-21 22:49:43
最简单的方法可能是将QTableWidgetItem子类化,然后实现<运算符,以便更好地认识到排序的是数字而不是字符串。
class MyTableWidgetItem : public QTableWidgetItem {
public:
bool operator <(const QTableWidgetItem &other) const
{
return text().toInt() < other.text().toInt();
}
};
然后,当您填充您的表时,您可以向它传递知道如何正确排序的自定义项的实例,而不是泛型项。
发布于 2011-10-21 23:57:21
这些值被排序为字符串,因为您已将它们存储在模型中。
如果您让QVariant
自己进行转换,它可以记住数据的原始类型,排序时将使用该类型的比较运算符:
// Get the value from the CSV file as a numeric type
int valueFromCsvFile = ...;
// don't do this
QTableWidgetItem *item = new QTableWidgetItem(QString::number(valueFromCsvFile));
// but do this instead
QTableWidgetItem *item = new QTableWidgetItem;
item.setData(Qt::EditRole, valueFromCsvFile);
单元格编辑器还将适应QVariant的类型:
QSpinBox
适用于int
,QDoubleSpinBox
适用于double
和float
,QDateTimeEdit
适用于QDateTime
发布于 2013-05-31 04:34:10
在我的情况下,一种可行的方法是
1)填表前,关闭排序:
table.setSortingEnabled(False)
2)用空格填充数字串,使该列中的所有串的长度相等:
(' '+numStr)[-4:]
3)填表后,打开排序:
table.setSortingEnabled(True)
这修复了行排序问题和数字顺序。
https://stackoverflow.com/questions/7848683
复制相似问题