2010-02-20 10 views
6

Sto usando Qt4.5.2 su Linux. Ho un semplice QTableWidget, in cui una colonna mostra le date in un formato a misura d'uomo. Sfortunatamente le "date amichevoli" non sono facili da ordinare correttamente. Quindi, nel QTableWidget tengo una colonna nascosta con il timestamp UNIX corrispondente a quella data.Come ordinare un QTableWidget con il mio codice?

Sto cercando di assicurarmi che, ogni volta che viene richiesta una richiesta di ordinamento sulla colonna DATE, in realtà l'ordinamento venga eseguito sulla colonna TIMESTAMP (invisibile). Ho provato a reimplementare sortByColumn (questo è in Python) per sottoclassi da QTableWidget e definizione:

def sortByColumn(self, col, order): 
     print 'got request to sort col %d in order %s' % (col, str(order)) 

Eppure, ogni volta che clicco su una delle intestazioni del mio tavolo il metodo di ordinamento normale continua ad essere chiamato.

Come posso ignorarlo?

risposta

7

È 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

+0

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