3

プレゼンテーション:

5 つの列を持つテーブルと、2 番目の列のフィルターのように機能する QLineEdit があります。また、最初の列のテキストに一致する行を非表示/表示するボタンと、2 番目の列のテキストを強調表示するボタンを実装する予定です。

5 つの列は次のとおりです。

  1. アイコンだけで、各アイコンには名前が対応しています。
  2. リンクのように機能し、そのように見える必要があるハイパーリンク テキスト (QLabel 内の HTML アンカーのように)。
  3. KB、MB、GB、TB などで表されるファイル サイズ。2 列目のようなハイパーリンクである必要があります。
  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)

すべてがうまくいっています。最初の列にはアイコンのみが表示され、並べ替えが可能です。2 番目と 3 番目の列にはリッチテキストが表示され、カスタムの並べ替えは期待どおりに機能します。解決する必要がある唯一のことは、QLabel に Qt.TextElideMode がないという事実です。そのため、テキストが列に収まらない場合は切り取られます。

問題:

QSortFilterProxyModel を有効にすると、QLabels が消えます。そのため、通常の方法でテキストを表示する必要があり、カスタム ソートが機能しなくなります。
ここで立ち往生している、どこへ行けばいいのかわからない。その上、強調表示を実装する必要があり、その方法がわかりません。したがって、次のステップは強調表示の実装であることを念頭に置いて、最初の問題を解決する必要があります。

私は 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)

したがって、欠けているのはリッチテキストだけです。

4

0 に答える 0