如何在QTableWidget中对数据进行排序?
我有一个 QTableWidget,第一列包含从 1 到 1000 的数字。现在我需要根据第一列对表格进行排序。
我正在使用函数 sortItems(int column, Qt::AscendingOrder)
,但它显示为:
1、10、100、1000、101、102、...
但我需要这个结果:
1, 2, 3,4...., 1000。
我使用 CSV 文件来填充表格。
I have a QTableWidget
and the first column contains numbers from 1 to 1000. Now I need to sort the table based on this first column.
I'm using the function sortItems(int column, Qt::AscendingOrder)
, but it is displayed as:
1, 10, 100, 1000, 101, 102, ...
Yet I need this result:
1, 2, 3 ,4...., 1000.
I'm using a CSV file for populating the table.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(5)
最简单的方法可能是子类化 QTableWidgetItem 然后实现 <运算符要聪明地认识到您正在对数字而不是字符串进行排序。
class MyTableWidgetItem : public QTableWidgetItem {
public:
bool operator <(const QTableWidgetItem &other) const
{
return text().toInt() < other.text().toInt();
}
};
然后,当您填充表格时,您可以向其传递知道如何正确排序的自定义项目实例,而不是通用项目实例。
我不知道过去接受的答案是否有效,但对于 Qt5.1,它不起作用。
为了工作,operator<
定义必须与 qtablewidget.h
中的虚拟定义匹配。
另一个有趣的补充是对包含数字的项目进行排序,但以货币符号(例如 $
或 €
)开头或以 %
结尾。
下面是更新后的代码:
class TableNumberItem : public QTableWidgetItem
{
public:
TableNumberItem(const QString txt = QString("0"))
:QTableWidgetItem(txt)
{
}
bool operator < (const QTableWidgetItem &other) const
{
QString str1 = text();
QString str2 = other.text();
if (str1[0] == '
然后,您可以使用类似以下内容添加包含数字的项目:
myTableWidget->setItem(row, col, new TableNumberItem("$0"));
请注意,此类必须仅与数字一起使用,它不会正确对字符串进行排序(情况也是如此)与接受的答案)。
|| str1[0] == '€') {
str1.remove(0, 1);
str2.remove(0, 1); // we assume both items have the same format
}
if (str1[str1.length() - 1] == '%') {
str1.chop(1);
str2.chop(1); // this works for "N%" and for "N %" formatted strings
}
double f1 = str1.toDouble();
double f2 = str2.toDouble();
return str1.toDouble() < str2.toDouble();
}
};
然后,您可以使用类似以下内容添加包含数字的项目:
请注意,此类必须仅与数字一起使用,它不会正确对字符串进行排序(情况也是如此)与接受的答案)。
我遇到了同样的问题,@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();
}
};
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
这些值按字符串排序,因为您将它们以字符串形式存储在模型中。
如果让 QVariant 自行进行转换,它可以记住数据的原始类型,并且在排序时将使用该类型的比较运算符:
单元格编辑器还将适应数据的类型QVariant:
QSpinBox
用于int
,QDoubleSpinBox
用于double
和float
,QDateTimeEdit
为QDateTime
The values are sorted as strings because you stored them as such in the model.
The
QVariant
can remember the original type of the data if you let it do the conversion itself, and the comparison operator from that type will be used when sorting:The cell editor will also adapt to the type of the QVariant:
QSpinBox
forint
,QDoubleSpinBox
fordouble
andfloat
,QDateTimeEdit
forQDateTime