6

LinuxでQt4.5.2を使用しています。私は単純な QTableWidget を持っています。この列では、日付が人間にわかりやすい形式で表示されます。残念ながら、「人に優しい日付」を正しく並べ替えるのは簡単ではありません。そのため、QTableWidget には、その日付に対応する UNIX タイムスタンプを含む非表示の列を保持しています。

DATE列でソートするリクエストが発行されるたびに、実際には(非表示の)TIMESTAMP列でソートが行われるようにしています。QTableWidget からサブクラス化し、以下を定義して、sortByColumn (これは Python にあります) を再実装しようとしました。

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

それでも、テーブルのヘッダーの 1 つをクリックすると、通常の並べ替えメソッドが引き続き呼び出されます。

どうすれば上書きできますか?

4

1 に答える 1

8

独自のクラスを派生させてから、独自の演算子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_())

これにより、正しい結果が得られました。自分で実行して確認できます。セル テキストには、「Saturday 20. February 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

于 2010-02-21T01:59:40.650 に答える