Pregunta

Estoy utilizando Qt4.5.2 en Linux. Tengo un simple QTableWidget, en el que una columna muestra la fecha en un formato amigable humana. Por desgracia "fechas-amigable humanos" no son fáciles de clasificar correctamente. Así, en el QTableWidget guardo escondida una columna con la marca de tiempo UNIX que corresponde a esa fecha.

Estoy tratando de asegurarse de que, cada vez que una solicitud de ordenación en la columna de la fecha de emisión, en realidad, la especie se realiza en la columna TIMESTAMP (invisible). He intentado reimplementar sortByColumn (esto es en Python) como subclase de QTableWidget y definir:

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

Sin embargo, cada vez que haga clic en una de las cabeceras de mi mesa el método para ordenar la normalidad sigue llamando.

¿Cómo puedo cancelar?

¿Fue útil?

Solución

Se podría derivar su propia clase de QTableWidgetItem y luego escribir su propio operador __lt__. Esto aliviaría la necesidad de una columna adicional también. Algo a lo largo de las líneas de:

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_())

Esto produjo resultados correctos para mí, puede ejecutar por sí mismo para verificar. El texto pantallas de texto celular como "Sábado 20 de febrero de 2010", pero cuando se ordena en la columna que va correctamente ordenar por el campo sortKey que es "2010-02-20" (iso formateado).

Oh, sino que también debe tenerse en cuenta que esto no va a funcionar con PySide porque parece que el operador __lt__ no está obligado, en donde, como lo es con PyQt4. pasé un tiempo tratando de depuración por lo que no estaba funcionando y luego he pasado de PySide a PyQt4 y funcionó bien. Usted puede notar que el __lt__ no está aquí:

http://www.pyside.org/docs/pyside /PySide/QtGui/QTableWidgetItem.html

pero es aquí:

http://doc.qt.digia.com/4.5 /qtablewidgetitem.html#operator-lt

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top