2

QTableWidget の最初の列を次のように設定する必要があります: Row: 1, Row: 2...Row: 100 ですが、並べ替えが期待どおりに (数値的に) 機能しません。このコードでは並べ替えは正常に機能しますが、予期したテキストが得られません。

for i in range(0, self.rows):
    item = QtGui.QTableWidgetItem()
    item.setData(Qt.DisplayRole, "Row: %s" %(i) )
    item.setData(Qt.EditRole, i)
    self.ui.tableWidget.setItem(i, 0, item)

Row: 1, Row: 2, Row: 3... の代わりに 1,2,3,4... が得られます。また、DisplayRole で設定されているため、テキストが表示されることも期待されていました。どうにかしてこれを行うことはできますか、それともソートの目的で関数を書くことが唯一の方法ですか?

4

2 に答える 2

7

の場合QTableWidgetItemQt.DisplayRoleQt.EditRoleは同じように扱われます。

これは、コードで次のことを意味します。

item.setData(Qt.DisplayRole, "Row: %s" %(i) )
item.setData(Qt.EditRole, i)

2 行目は、最初の行のデータ セットを単純に上書きします。したがって、事実上、分離はありませんEditRole( dataandsetData関数が再実装されない限り)。

並べ替えの動作を変更する標準的な方法は、小なり演算子 for を再実装することですQTableWidgetItem(既定では、並べ替えにデータを使用するようにハードコードされていますDisplayRole)。

次のサブクラスは、数値ソートのために Qt が通常行うことを再現します。

class TableWidgetItem(QtGui.QTableWidgetItem):
    def __lt__(self, other):
        return (self.data(QtCore.Qt.UserRole).toLongLong() <
                other.data(QtCore.Qt.UserRole).toLongLong())
于 2012-10-01T15:10:44.213 に答える
5

DisplayRole と EditRole が期待どおりに機能しない理由にまだ興味がありますが、次のように問題を解決しました。

class MyTableWidgetItem(QtGui.QTableWidgetItem):
    def __init__(self, text, sortKey):
            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 

... データを入力するテーブル:

for i in range(0, self.rows):
    item = MyTableWidgetItem("Row: %s" %(i), i)
    self.ui.tableWidget.setItem(i, 1, item)
于 2012-10-01T13:33:26.693 に答える