重载“<” QStandardItem中的运算符,但它没有被调用

时间:2013-03-12 18:43:44

标签: python qt pyqt operator-overloading pyside

我有一个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)

1 个答案:

答案 0 :(得分: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类进行排序。这很好用。