如何在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在内的所有正数。这不是问题。这是一个带问号的名词短语。