我有一个 QTreeWidget,其中有一列填充了一些数字,我该如何对它们进行排序?
如果我使用 setSortingEnabled(true); 我只能正确排序字符串,因此我的列已排序:
1 10 100 2 20 200
但这不是我想要的!建议?
我有一个 QTreeWidget,其中有一列填充了一些数字,我该如何对它们进行排序?
如果我使用 setSortingEnabled(true); 我只能正确排序字符串,因此我的列已排序:
1 10 100 2 20 200
但这不是我想要的!建议?
您可以排序覆盖 < 运算符并像这样更改排序条件。
class TreeWidgetItem : public QTreeWidgetItem {
public:
TreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent){}
private:
bool operator<(const QTreeWidgetItem &other)const {
int column = treeWidget()->sortColumn();
return text(column).toLower() < other.text(column).toLower();
}
};
在这个例子中,它忽略了真实的大小写,面对小写模式的字段。
这是一个使用 pyQt 的实现__lt__
class TreeWidgetItem(QtGui.QTreeWidgetItem):
def __init__(self, parent=None):
QtGui.QTreeWidgetItem.__init__(self, parent)
def __lt__(self, otherItem):
column = self.treeWidget().sortColumn()
return self.text(column).toLower() < otherItem.text(column).toLower()
我发现的最好方法是使用 try 块来查找数字
class TreeWidgetItem( QtGui.QTreeWidgetItem ):
def __init__(self, parent=None):
QtGui.QTreeWidgetItem.__init__(self, parent)
def __lt__(self, otherItem):
column = self.treeWidget().sortColumn()
try:
return float( self.text(column) ) > float( otherItem.text(column) )
except ValueError:
return self.text(column) > otherItem.text(column)
数字按数值排序,但字符串排序相反(即"19999" < "2"
)。
更具体地说,字符串从左到右逐个字符进行比较,直到其中一个或其他字符不同,此时停止比较。例如,19
将121
像这样进行比较:
"19"[0] != "121"[0] ? // no
"19"[1] != "121"[1] ? // yes
'9' > '2' ? // yes
return some value that indicates "19" greater than "121";
要正确排序它们,您需要将它们转换为数值,然后对它们进行排序。除此之外,您可以实现自己的排序算法,以正确的方式读取数字。