È possibile ottenere la propria classe di QTableWidgetItem
e quindi scrivere il proprio operatore __lt__
. Ciò allevierebbe anche la necessità di una colonna in più. Qualcosa sulla falsariga di:
from PyQt4 import QtCore, QtGui
import sys
import datetime
class MyTableWidgetItem(QtGui.QTableWidgetItem):
def __init__(self, text, sortKey):
#call custom constructor with UserType item type
QtGui.QTableWidgetItem.__init__(self, text, QtGui.QTableWidgetItem.UserType)
self.sortKey = sortKey
#Qt uses a simple < check for sorting items, override this to use the sortKey
def __lt__(self, other):
return self.sortKey < other.sortKey
app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.setGeometry(0, 0, 400, 400)
table = QtGui.QTableWidget(window)
table.setGeometry(0, 0, 400, 400)
table.setRowCount(3)
table.setColumnCount(1)
date1 = datetime.date.today()
date2 = datetime.date.today() + datetime.timedelta(days=1)
date3 = datetime.date.today() + datetime.timedelta(days=2)
item1 = MyTableWidgetItem(str(date1.strftime("%A %d. %B %Y")), str(date1))
item2 = MyTableWidgetItem(str(date2.strftime("%A %d. %B %Y")), str(date2))
item3 = MyTableWidgetItem(str(date3.strftime("%A %d. %B %Y")), str(date3))
table.setItem(0, 0, item1)
table.setItem(2, 0, item2)
table.setItem(1, 0, item3)
table.setSortingEnabled(True)
window.show()
sys.exit(app.exec_())
Ciò ha prodotto risultati corretti per me, è possibile gestire direttamente da verificare. Il testo della cella visualizza il testo come "Sabato 20. Febbraio 2010" ma quando si ordina sulla colonna verrà correttamente ordinato dal campo sortKey
che è "2010-02-20" (iso formattato).
Oh, Va anche notato che questo NON funzionerà con PySide perché sembra che l'operatore __lt__
non sia collegato, dove, come con PyQt4. Ho passato un po 'di tempo cercando di eseguire il debug perché non funzionava e poi sono passato da PySide a PyQt4 e ha funzionato bene. Si può notare che il __lt__
non è elencato qui:
http://www.pyside.org/docs/pyside/PySide/QtGui/QTableWidgetItem.html
ma è qui:
http://doc.qt.digia.com/4.5/qtablewidgetitem.html#operator-lt
Salve, questo mi ha veramente aiutato. Avevo bisogno del mio operatore '__lt__' in modo da poter ordinare elementi tablewidget selezionabili nella prima colonna, ma ora quando uso' tableWidget.setSortingEnabled (1) 'per qualche ragione' __lt__' è chiamato 100+ volte quando ho ~ 15 righe, anche se non ho fatto clic sull'intestazione di quella colonna per ordinarlo. Un problema ancora più grande è che non risolve il problema in quella situazione. poche righe vengono mixate tutte, ma funziona bene quando faccio clic sull'intestazione. Esistono alcune funzionalità di blocco che passiamo durante il sovraccarico di '__lt__'? – Aleksandar