1

我有一个带有 a 的用户界面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 回答