如何在QTableWidget中对数据进行排序?
我有一个如何在QTableWidget中对数据进行排序?,qt,Qt,我有一个QTableWidget,第一列包含从1到1000的数字。现在我需要根据第一列对表进行排序 我正在使用函数sortItems(int列,Qt::AscendingOrder),但它显示为: 1、10、100、1000、101、102 但我需要这个结果: 一、二、三、四、一千 我正在使用CSV文件填充表。最简单的方法可能是将QTableWidgetItem子类化,然后实现
QTableWidget
,第一列包含从1到1000的数字。现在我需要根据第一列对表进行排序
我正在使用函数sortItems(int列,Qt::AscendingOrder)
,但它显示为:
1、10、100、1000、101、102
但我需要这个结果:
一、二、三、四、一千
我正在使用CSV文件填充表。最简单的方法可能是将QTableWidgetItem子类化,然后实现<运算符,以便对数字而不是字符串进行排序
class MyTableWidgetItem : public QTableWidgetItem {
public:
bool operator <(const QTableWidgetItem &other) const
{
return text().toInt() < other.text().toInt();
}
};
MyTableWidgetItem类:公共QTableWidgetItem{
公众:
bool操作符值被排序为字符串,因为您将它们存储在模型中 如果您让
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);
table.setSortingEnabled(True)
单元编辑器也将适应QVariant的类型:
用于QSpinBox
int
用于QDoubleSpinBox
和double
float
QDateTime编辑
QDateTime
- 在我的情况下,一种有效的方法是
1) 填写表格之前,请关闭排序:
table.setSortingEnabled(False)
2) 用空格填充数字字符串,并使列中的所有字符串具有相同的长度:
(' '+numStr)[-4:]
3) 填写表格后,启用排序:
// 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);
table.setSortingEnabled(True)
这修复了行排序问题和数字顺序。我不知道接受的答案是否适用,但对于Qt5.1,它不适用。
为了工作,
操作员我遇到了同样的问题,@Chris的答案为我工作!
但需要稍作修改。我不能评论。所以我写在这里
class MyTableWidgetItem : public QTableWidgetItem {
public:
bool operator <(const QTableWidgetItem &other) const
{
if (text()=="")
return text().toDouble() > other.text().toDouble();
else
return text().toDouble() < other.text().toDouble();
}
};
MyTableWidgetItem类:公共QTableWidgetItem{
公众:
bool运算符other.text().toDouble();
其他的
返回text().toDouble()
我使用了“item.setData(Qt::EditRole,valueFromCsvFile)”,现在它可以正常工作了。谢谢@Shyam,为什么不把这个作为公认的答案呢?我在这方面遇到了麻烦,因为我使用的是long int,奇怪的是,QVariant将与long long int或int一起工作,但不是long int。将long int转换为qlonglong对我来说很有效。这应该是公认的答案,它比其他方法简单得多!谢谢,这个有用。在较新版本的Qt中,签名已略微更改为bool operator<(const-QTableWidgetItem&other)const
严重,如果setData(Qt::DisplayRole,num)
对您不起作用,您应该尝试此操作。这没有意义。如果text()
为空,则text()。您应该使用该特定号码进行检查,而不是更改运算符。如果您希望text()
为空,则other.text()
也可能为空。我认为空单元格为空,无需排序。它适用于包括0在内的所有正数。这不是问题。这是一个带问号的名词短语。