블로그 (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)