1

を使用した UI があり、そのデータQTableViewに が使用されます。QStandardItemModel一部のデータは数値であるためQStandardItem、独自の比較を実装するために をサブクラス化しました。ドキュメントによると、"<"演算子 (__lt__(...)関数) をオーバーライドするだけで済みます。ただし、テーブル ビューで列ヘッダーをクリックすると、並べ替えが正しく行われません。私のモデル「フィラー」は非常に単純です。

self.model.removeRows(0, self.model.rowCount())
for i in range(0, len(self.mainFlatList)):
   self.model.setItem(i, 0, QStandardItem(self.mainFlatList[str(i)]["ID"]))
   self.model.setItem(i, 1, QStandardItem(self.mainFlatList[str(i)]["type"]))
   self.model.setItem(i, 2, QStandardItem(self.mainFlatList[str(i)]["string1"]))
   self.model.setItem(i, 3, QStandardItem(self.mainFlatList[str(i)]["string2"]))
   self.model.setItem(i, 4, QStandardItem(self.mainFlatList[str(i)]["timeva1"]))
   self.model.setItem(i, 5, QStandardItem(self.mainFlatList[str(i)]["timeval2"]))
   currentOPTimePercent = (float(self.mainFlatList[str(i)]["timeval1"])/self.totalTime) * 100
   self.mainFlatList[str(i)]["timePercent"] = currentOPTimePercent
   self.model.setItem(i, 6, MQStandardItem(str(self.mainFlatList[str(i)]["timePercent"])))

MQStandardItem単純な場所は次のとおりです。

class MQStandardItem(QStandardItem):
def __init__(self, value):
    print "NumericalStandardItem", value
    QStandardItem.__init__(self, value)

def __lt__(self, obj):
    print "Sorting!"
    try:
        return float(self.text()) < float(obj.text())
    except:
        pass

    # Fallback to use standard __lt__
    return self.text() < obj.text()

なぜこれが失敗するのかについてのアイデアはありますか? __lt__(...)また、関数内の print ステートメントが出力されないことにも注意する必要があります。それが役立つ場合は、UI を構築する方法を次に示します。

    self.model = QStandardItemModel(numRows,numColumns)
    self.model.setHorizontalHeaderItem(0, QStandardItem("ID"))
    self.model.setHorizontalHeaderItem(1, QStandardItem("Type"))
    self.model.setHorizontalHeaderItem(2, QStandardItem("string1"))
    self.model.setHorizontalHeaderItem(3, QStandardItem("string2"))
    self.model.setHorizontalHeaderItem(4, QStandardItem("timeval1"))
    self.model.setHorizontalHeaderItem(5, QStandardItem("timeval2"))
    self.model.setHorizontalHeaderItem(6, QStandardItem("timePercent"))

    self.tableView = QTableView()
    self.tableView.setModel(self.model)
    self.tableView.setSortingEnabled(True)
    self.tableView.setSelectionMode(QAbstractItemView.SingleSelection)
    self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
    self.tableView.selectionModel().currentChanged.connect(self.foo)
4

1 に答える 1

1

これは Qt のバグのようです。この問題について尋ねている古い投稿があります。

http://www.qtcentre.org/threads/46985-any-solution-to-QtableView-sorting

QTableView クラスのソースを調べると、ビューとモデルの間の接続がまだ確立されていないようです。少なくとも以下を見てください。

http://qt.gitorious.org/qt/qt-gberg/blobs/90cdbf8bd409652fd1e28adcd7f02fc1fae2c1c0/src/gui/itemviews/qtableview.cpp (行 2280)

http://qt.gitorious.org/qt/qt/blobs/85f42777111060037476895ed08ded513d44a048/src/gui/itemviews/qstandarditemmodel.cpp (247 行目)

回避策は、QTreeWidget を使用し、ソートのために独自の QTreeWidgetItem クラスをロールバックすることです。これはうまくいきます。

于 2013-03-13T01:30:23.217 に答える