PyQt4:按包含图标的列对QTableWidget进行排序

时间:2013-08-15 19:22:28

标签: python pyqt pyqt4

我有一个包含项目列表的数据库,每个项目都有一个关联的“rating”字段,这是一个0-5的浮点数。现在,当我用这些项填充QTableWidget时,我想显示评级的图像而不是浮点数。所以我这样做:

iconPath = "images/icons/ratings/"+backend.utilities.pickRatingIcon(col)
icon = QtGui.QIcon(QtGui.QPixmap(iconPath))
item = QtGui.QTableWidgetItem(icon, "")
self.deckTable.setItem(i, j, item)

一切正常,但我自然失去了按该列排序的能力。我可以将第三行更改为:

item = QtGui.QTableWidgetItem(icon, col)

允许我再次排序,但随后我得到了图标旁边的那个失败目的的浮动。有没有办法只显示图标,但按值排序?

2 个答案:

答案 0 :(得分:1)

首先,您必须存储评级。

item = QtGui.QTableWidgetItem(icon, "")
self.deckTable.itemsRating[item]=rating
self.deckTable.setItem(i, j, item)

然后覆盖子类化QtableWidget的sortItems并手动重新排列项目:

class DeckTableWidget(QtGui.QTableWidget):
itemsRating=dict()
def sortItems(self, column, order=QtCore.Qt.AscendingOrder):
  _list=[]
  for row in self.rowCount():
      item = self.takeItem(row, column)
      _list.append((item, self.itemsRating[item]))
  _list.sort(lambda x,y: cmp(x.[1], y.[1])
  if order != QtCore.Qt.AscendingOrder:
      _list.reverse()
  for row in self.rowCount():
      self.setItem(row, column, _list.pop()[0])

答案 1 :(得分:1)

我找到了一个适合我的答案。这与我之前做的基本相同 - 也就是说,该值包含在图标中。但是我正在调整列的大小来覆盖值,然后阻止它调整大小。

item = QtGui.QTableWidgetItem()
# We set our icon and value
item.setIcon(icon)
item.setData(QtCore.Qt.EditRole, QtCore.QVariant(col))
# We set the size of our item. My icon is 80x32 pixels, but it was getting clipped off so I added 5 pixels of width
item.setData(QtCore.Qt.SizeHintRole, QtCore.QSize(85,32))
# We prevent the column from being resized. In my case it's the first column, so the index is 0
self.deckTable.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Fixed)