3

介绍:

我有一个有 5 列的表和一个 QLineEdit,它的作用类似于第二列的过滤器。另外,我计划实现一个按钮来隐藏/显示与第一列中的文本匹配的行,另一个按钮来突出显示第二列中的文本。

五列是:

  1. 只是图标,每个图标对应一个名称。
  2. 必须表现得像链接的超链接文本(就像 QLabel 中的 HTML 锚)。
  3. 文件大小以:KB、MB、GB、TB 等表示。必须是超链接,如第二列。
  4. 整数
  5. 整数

所有列都必须是可排序的。

在实现 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)

所以,富文本是唯一缺少的东西。

4

0 回答 0