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

Python PyQt4:按包含图标的列对QTableWidget进行排序,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我有一个包含项目列表的数据库,每个项目都有一个关联的“评级”字段,它是一个0-5的浮动范围。现在,当我用这些项目填充QTableWidget时,我想显示评级的图像,而不是浮动。所以我这样做: iconPath = "images/icons/ratings/"+backend.utilities.pickRatingIcon(col) icon = QtGui.QIcon(QtGui.QPixmap(iconPath)) item = QtGui.QTableWidgetItem(icon, "

我有一个包含项目列表的数据库,每个项目都有一个关联的“评级”字段,它是一个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)

这让我可以再次排序,但我得到图标旁边的浮动,这有点违背了目的。有没有办法只显示图标而按值排序?

首先,您必须存储评级

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])

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

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)

这似乎是正确的方法,但同时我为我的具体问题找到了一个更优雅的解决方案。我会发布我自己的答案,可能会接受它,除非有人提出更好的答案,我会投你的票。谢谢发布你的答案,它帮助我节省了一些时间。