我有一个包含5列的表和一个QLineEdit,其作用类似于第二列的过滤器。另外,我正在计划实现一个按钮来隐藏/显示与第一列中的文本匹配的行,另一个用于突出显示第二列中的文本。
五列是:
所有列都需要排序。
在实施QSortFilterProxyModel之前,我几乎能解决所有问题 这就是我所拥有的:
ResultsStandardItem.py(用于自定义排序的QStandardItem的子类):
from PyQt4 import QtGui
import re
class ResultsStandardItem(QtGui.QStandardItem):
def __init__(self, sortKey, sortType='string'):
super(ResultsStandardItem, self).__init__()
if sortType == 'size':
suf = re.search('(KB|B|GB|MB|TB)$', sortKey).group(1)
num = float(re.search('^[0-9]+(?:\.[0-9]+)?', sortKey).group())
if suf == 'B':
self.sortKey = num
elif suf == 'KB':
self.sortKey = num * 1024
elif suf == 'MB':
self.sortKey = num * 1024 * 1024
elif suf == 'GB':
self.sortKey = num * 1024 * 1024 * 1024
elif suf == 'TB':
self.sortKey = num * 1024 * 1024 * 1024 * 1024
else:
self.sortKey = sortKey
def __lt__(self, other):
return self.sortKey < other.sortKey
主要代码:
resultsMdl = QtGui.QStandardItemModel(self)
resultsTbl = QtGui.QTableView(self)
resultsTbl.setModel(resultsMdl)
...
for i in range(len(site)):
row = resultsMdl.rowCount()
resultsMdl.insertRow(row)
columnOneItem = ResultsStandardItem(str.lower(site[i]))
columnOneItem.setIcon(QtGui.QIcon('img/' + str.lower(site[i]) + '.png'))
columnTwoItem = QtGui.QStandardItem()
columnTwoItemLa = QtGui.QLabel('<a href="' + details[i] + '">' + file[i] + '</a>')
columnTwoItemLa.setOpenExternalLinks(True)
columnThreeItem = ResultsStandardItem(size[i], 'size')
columnThreeItem.setData(size[i])
columnThreeItemLa = QtGui.QLabel('<a href="' + download[i] + '">' + size[i] + '</a>')
columnThreeItemLa.setOpenExternalLinks(True)
columnFourItem = QtGui.QStandardItem()
columnFourItem.setData(seeders[i], Qt.DisplayRole)
columnFiveItem = QtGui.QStandardItem()
columnFiveItem.setData(leechers[i], Qt.DisplayRole)
resultsMdl.setItem(row, 0, columnOneItem)
resultsMdl.setItem(row, 1, columnTwoItem)
resultsTbl.setIndexWidget(columnTwoItem.index(), columnTwoItemLa)
resultsMdl.setItem(row, 2, columnThreeItem)
resultsTbl.setIndexWidget(columnThreeItem.index(), columnThreeItemLa)
resultsMdl.setItem(row, 3, columnFourItem)
resultsMdl.setItem(row, 4, columnFiveItem)
resultsTbl.setSortingEnabled(True)
一切都很好。第一列仅显示图标并可排序,第二列和第三列显示richtext,自定义排序按预期工作。唯一应该解决的问题是,QLabel没有Qt.TextElideMode,因此,当文本不适合列时,它就会被切断。
当我启用QSortFilterProxyModel时,QLabel消失。所以我必须以正常方式显示文本,自定义排序停止工作 我被困在这里,不知道去哪里。此外,我必须实施突出显示,我不知道如何。所以我需要解决第一个问题,记住下一步是突出显示的实现。
我是Python和Qt的新手,需要有人向我解释正确的方法。过去几天我一直在这。我不想选择第一个选择,然后回去,因为这种方法不允许我实现我需要的其他东西。
提前致谢。
修改
我能够使用自定义搜索设置“setSortRole(Qt.UserRole)”。对于每个项目,我使用将用于排序的相应值设置数据。另外,我更改了“ResultsStandardItem”以设置数据而不是sortKey。
ResultsStandardItem.py:
...
else:
self.sortKey = sortKey
self.setData(self.sortKey, Qt.UserRole)
主:
columnThreeItem = ResultsStandardItem(size[i], 'size')
columnThreeItem.setData(size[i], Qt.DisplayRole)
因此,richtext是唯一缺少的东西。