介绍:
我有一个有 5 列的表和一个 QLineEdit,它的作用类似于第二列的过滤器。另外,我计划实现一个按钮来隐藏/显示与第一列中的文本匹配的行,另一个按钮来突出显示第二列中的文本。
五列是:
- 只是图标,每个图标对应一个名称。
- 必须表现得像链接的超链接文本(就像 QLabel 中的 HTML 锚)。
- 文件大小以:KB、MB、GB、TB 等表示。必须是超链接,如第二列。
- 整数
- 整数
所有列都必须是可排序的。
在实现 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)
一切都很好。第一列仅显示图标并且是可排序的,第二列和第三列显示富文本,并且自定义排序按预期工作。唯一应该解决的问题是 QLabel 没有 Qt.TextElideMode,因此,当文本不适合列时,它就会被剪切。
问题:
当我启用 QSortFilterProxyModel 时,QLabels 消失了。所以我必须以正常方式显示文本,并且自定义排序停止工作。
我被困在这里,不知道去哪里。此外,我必须实现突出显示,我不知道如何。所以我需要解决第一个问题,记住下一步是实现突出显示。
我是 Python 和 Qt 的新手,需要有人向我解释正确的方法。最近几天我一直在做这个。我不想选择第一个替代方案然后返回,因为这种方法不允许我实现我需要的其他东西。
提前致谢。
编辑:
我能够使用自定义搜索设置“setSortRole(Qt.UserRole)”。对于每个项目,我将数据设置为将用于排序的相应值。另外,我将“ResultsStandardItem”更改为设置数据而不是 sortKey。
结果标准项目.py:
...
else:
self.sortKey = sortKey
self.setData(self.sortKey, Qt.UserRole)
主要的:
columnThreeItem = ResultsStandardItem(size[i], 'size')
columnThreeItem.setData(size[i], Qt.DisplayRole)
所以,富文本是唯一缺少的东西。