プレゼンテーション:
5 つの列を持つテーブルと、2 番目の列のフィルターのように機能する QLineEdit があります。また、最初の列のテキストに一致する行を非表示/表示するボタンと、2 番目の列のテキストを強調表示するボタンを実装する予定です。
5 つの列は次のとおりです。
- アイコンだけで、各アイコンには名前が対応しています。
- リンクのように機能し、そのように見える必要があるハイパーリンク テキスト (QLabel 内の HTML アンカーのように)。
- KB、MB、GB、TB などで表されるファイル サイズ。2 列目のようなハイパーリンクである必要があります。
- 整数
- 整数
すべての列がソート可能である必要があります。
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)
したがって、欠けているのはリッチテキストだけです。