如何在QTableWidget中对数据进行排序?

Shy*_*yam 12 qt

我有一个QTableWidget,第一列包含从1到1000的数字.现在我需要根据第一列对表进行排序.

我正在使用该功能sortItems(int column, Qt::AscendingOrder),但它显示为:

1,10,100,1000,101,102,......

但我需要这个结果:

1,2,3,4 ......,1000.

我正在使用CSV文件填充表格.

ale*_*sdm 22

这些值按字符串排序,因为您将它们存储在模型中.

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);    
Run Code Online (Sandbox Code Playgroud)

单元格编辑器还将适应QVariant的类型:

  • QSpinBox对于int,
  • QDoubleSpinBoxdoublefloat,
  • QDateTimeEdit 对于 QDateTime
  • ...

  • 这应该是公认的答案,它比其他答案简单得多! (2认同)

Chr*_*ris 11

最简单的方法可能是继承QTableWidgetItem,然后实现<运算符,以便你对数字而不是字符串进行排序.

class MyTableWidgetItem : public QTableWidgetItem {
    public:
        bool operator <(const QTableWidgetItem &other) const
        {
            return text().toInt() < other.text().toInt();
        }
};
Run Code Online (Sandbox Code Playgroud)

然后,当您填充表时,您可以传递自定义项的实例,这些实例知道如何正确排序自己而不是通用排序项.