首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在QTableWidget中对数据进行排序?

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

Stack Overflow用户
提问于 2011-10-21 19:22:32
回答 5查看 26.7K关注 0票数 16

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

我使用的是函数sortItems(int column, Qt::AscendingOrder),但它显示为:

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

然而,我需要这样的结果:

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

我使用CSV文件来填充表。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-21 22:49:43

最简单的方法可能是将QTableWidgetItem子类化,然后实现<运算符,以便更好地认识到排序的是数字而不是字符串。

代码语言:javascript
复制
class MyTableWidgetItem : public QTableWidgetItem {
    public:
        bool operator <(const QTableWidgetItem &other) const
        {
            return text().toInt() < other.text().toInt();
        }
};

然后,当您填充您的表时,您可以向它传递知道如何正确排序的自定义项的实例,而不是泛型项。

票数 14
EN

Stack Overflow用户

发布于 2011-10-21 23:57:21

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

如果您让QVariant自己进行转换,它可以记住数据的原始类型,排序时将使用该类型的比较运算符:

代码语言:javascript
复制
// 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适用于doublefloat
  • QDateTimeEdit适用于QDateTime
  • ...
票数 27
EN

Stack Overflow用户

发布于 2013-05-31 04:34:10

在我的情况下,一种可行的方法是

1)填表前,关闭排序:

代码语言:javascript
复制
table.setSortingEnabled(False)

2)用空格填充数字串,使该列中的所有串的长度相等:

代码语言:javascript
复制
('    '+numStr)[-4:]

3)填表后,打开排序:

代码语言:javascript
复制
table.setSortingEnabled(True)

这修复了行排序问题和数字顺序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7848683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档