如何使用QSortFilterProxyModel在QTableView中显示richtext?

时间:2012-10-07 21:38:22

标签: pyqt4 qtableview richtext qsortfilterproxymodel

演示:

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

五列是:

  1. 只是图标,每个图标对应一个名称。
  2. 必须采取行动并看起来像链接的超链接文本(就像QLabel中的HTML锚点一样)。
  3. 文件大小表示为:KB,MB,GB,TB等。必须是超链接,如第二列。
  4. 整数
  5. 整数
  6. 所有列都需要排序。

    在实施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是唯一缺少的东西。

0 个答案:

没有答案