python sorting pyqt pyside qtreewidget

python - Ordenar un PySide.QtGui.QTreeWidget por una columna alfanumérica



sorting pyqt (1)

Me gustaría ordenar un QTreeWidget por la columna alpha_numeric .

Actualizar:

Siguiendo el ejemplo de ekhumoro , volví a implementar el método QTreeWidgetItem __lt__ para usar la clasificación natural deseada .

Código relevante:

class TreeWidgetItem(QtGui.QTreeWidgetItem): def __lt__(self, other): column = self.treeWidget().sortColumn() key1 = self.text(column) key2 = other.text(column) return self.natural_sort_key(key1) < self.natural_sort_key(key2) @staticmethod def natural_sort_key(key): regex = ''(/d*/./d+|/d+)'' parts = re.split(regex, key) return tuple((e if i % 2 == 0 else float(e)) for i, e in enumerate(parts))

Ejemplo de trabajo completo actualizado:

import sys import re from PySide import QtGui, QtCore data = [ {"name": "Apple", "alpha_numeric": "11"}, {"name": "Apple", "alpha_numeric": "125b"}, {"name": "Apple", "alpha_numeric": "125a"}, {"name": "Apple", "alpha_numeric": "3"}, {"name": "Orange", "alpha_numeric": "11"}, {"name": "Orange", "alpha_numeric": "125b"}, {"name": "Orange", "alpha_numeric": "125a"}, {"name": "Orange", "alpha_numeric": "3"}, ] # re-implement the QTreeWidgetItem class TreeWidgetItem(QtGui.QTreeWidgetItem): def __lt__(self, other): column = self.treeWidget().sortColumn() key1 = self.text(column) key2 = other.text(column) return self.natural_sort_key(key1) < self.natural_sort_key(key2) @staticmethod def natural_sort_key(key): regex = ''(/d*/./d+|/d+)'' parts = re.split(regex, key) return tuple((e if i % 2 == 0 else float(e)) for i, e in enumerate(parts)) class MainWindow(QtGui.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.resize(300, 300) self.table = None self.ui() def ui(self): # setup the table self.table = QtGui.QTreeWidget() self.table.setRootIsDecorated(False) self.table.setAlternatingRowColors(True) self.table.setSortingEnabled(True) # columns and widths column_names = [''Name'', ''Alpha Numeric''] self.table.setColumnCount(2) self.table.setColumnWidth(0, 150) self.table.setColumnWidth(1, 150) self.table.setHeaderLabels(column_names) # row data for row in data: column = TreeWidgetItem(self.table) column.setSizeHint(0, QtCore.QSize(30, 30)) column.setText(0, row[''name'']) column.setText(1, row[''alpha_numeric'']) # sort self.table.sortByColumn(1, QtCore.Qt.AscendingOrder) self.table.sortByColumn(0, QtCore.Qt.AscendingOrder) # setup the layout self.setCentralWidget(self.table) if __name__ == ''__main__'': app = QtGui.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())


Puede volver a implementar el operador inferior a los elementos de su widget de tabla y usar el algoritmo que desee para controlar la ordenación:

class TableWidgetItem(QtGui.QTableWidgetItem): def __lt__(self, other): return funky_sort_key(self.text(), other.text())

Con este método, ni siquiera necesita ordenar por texto; también puede ordenar por los datos de los elementos (o lo que sea).