블로그 (Blog)/개발로그 (Devlogs)
Natural sort for items of QTreeView of PySide.
티클러
2025. 4. 15. 14:21
qtreeview의 헤더를 클릭했을때.. 아이템을 natural sort 하는 코드..
re_human_key = re.compile(r'(\d*\.\d+|\d+)')
class NaturalSortProxyModel(QSortFilterProxyModel):
_key_cache = {}
def _human_key(self, key):
if key is None:
key = ''
if key not in self._key_cache:
parts = re_human_key.split(str(key))
human_key = tuple((e.swapcase() if i % 2 == 0 else float(e)) for i, e in enumerate(parts))
self._key_cache[key] = human_key
return self._key_cache[key]
def lessThan(self, left, right):
leftData = self.sourceModel().data(left)
rightData = self.sourceModel().data(right)
if isinstance(leftData, (int, float)) and isinstance(rightData, (int, float)):
return leftData < rightData
return self._human_key(leftData) < self._human_key(rightData)