Domanda

Sto usando Qt4.5.2 su Linux. Ho una semplice QTableWidget, in cui una colonna visualizza le date in un formato human-friendly. Purtroppo "date human-friendly" non sono facili da ordinare in modo corretto. Così, nel QTableWidget continuo a una colonna nascosta con il timestamp UNIX corrispondente a tale data.

che sto cercando di fare in modo che, ogni volta che una richiesta di ordinare la colonna data di emissione, in realtà l'ordinamento essere fatto sul (invisibile) colonna TIMESTAMP. Ho provato reimplementando sortByColumn (questo è in Python) sottoclasse da QTableWidget e definendo:

   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 chiamati.

Come posso ignorarlo?

È stato utile?

Soluzione

Si potrebbe derivare la propria classe di QTableWidgetItem e poi scrivere il proprio operatore di __lt__. Ciò allevierebbe la necessità di una colonna in più pure. 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_())

Questo prodotto risultati corretti per me, è possibile gestire direttamente da verificare. Il testo testo cella viene visualizzato come "Sabato 20 febbraio 2010", ma quando si ordina la colonna lo farà correttamente ordina per il 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 è vincolato, in cui, come è con PyQt4. Ho passato un po '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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top