1

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

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

4

2 回答 2

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)
于 2013-08-17T00:46:17.090 回答
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])
于 2013-08-15T21:56:53.360 回答