我有一个包含项目列表的数据库,每个项目都有一个关联的“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)
允许我再次排序,但随后我得到了图标旁边的那个失败目的的浮动。有没有办法只显示图标,但按值排序?
答案 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)