Как отсортировать QTableWidget с моим собственным кодом?

Я использую Qt4.5.2 на Linux. У меня есть простой QTableWidget, в который даты отображений столбца в человечески-благоприятном формате. К сожалению, "человечески-благоприятные даты" не легки к виду правильно. Так, в QTableWidget я сохраняю скрытый столбец с меткой времени UNIX, соответствующей той дате.

Я пытаюсь удостовериться это, каждый раз, когда запрос к виду в день столбец выпущен, в действительности вид быть сделанным на (невидимом) столбце TIMESTAMP. Я пытался повторно реализовать sortByColumn (это находится в Python) путем разделения на подклассы от QTableWidget и определения:

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

Все же, каждый раз, когда я нажимаю на один из заголовков моей таблицы, нормальный метод сортировки продолжает называться.

Как я могу переопределить его?

6
задан Trilarion 29 January 2015 в 08:16
поделиться

1 ответ

Вы можете создать свой собственный класс QTableWidgetItem , а затем написать свой собственный оператор __ lt __ .Это также избавит от необходимости в дополнительной колонке. Что-то вроде:

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

Это дало мне правильные результаты, вы можете запустить это самостоятельно, чтобы проверить. В тексте ячейки отображается текст вроде «Суббота, 20 февраля 2010 г.», но при сортировке по столбцу он будет правильно отсортирован по полю sortKey , которое имеет значение «2010-02-20 дюймов (в формате iso).

О, также следует отметить, что это НЕ будет работать с PySide, потому что кажется, что оператор __ lt __ не привязан, где - как это было с PyQt4. Некоторое время я пытался выяснить, почему он не работает, а затем переключился с PySide на PyQt4, и он работал нормально. Вы можете заметить, что __ lt __ здесь не указан:

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

, но он здесь:

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

7
ответ дан 17 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: