テーブルモデルの2つの列の1つに対応する「名、姓」などの文字列を入力する行編集でコンプリータを完成させようとしています(最終的な目標は、順序を柔軟にすることです。しかし、今のところ、これを実行したいだけです)。私がそれについて行こうとしている現在の方法は次のいずれかです:
a) 2 つの列からの結果をプロキシにマージし、firstname,lastname を個別の文字列として持つ 3 番目の列 (これは、ユーザーが lastname,firstname として入力すると不便です。現在の実装は、試してみると動作しません。 「偽の」列でsetCompletionColumnを実行すると、再実装されたデータメソッドがアクティブになりません.columnCountには偽の列が含まれています)
b) フィルタリングしないコンプリータがあり、最初と最後の両方でrow() フィルタ フィルタを受け入れるバックエンド プロキシモデルがあります (非フィルタリング コンプリータを実行する方法がわかりません。それ以外の場合は、1 つの列とポップアップを調べるだけです)。最後に、姓のない名の束が表示されます)
c) ツリー モデルをスプーフィングし、コンマを置くと、モデルは、最初または最後の名前がコンマの前の文字列 (で始まる?) であるすべての人で構成される「ブランチ」を調べます。(私はこれを始める方法さえわからないようです.bと同じ種類のacceptsrowを使用します)が、別の〜ブランチ〜のように行う方法はわかりません)
これは私に頭痛の種であり、これらの実装はどれも特に快適ではありません。私はこれを自分自身に負担をかけすぎていて、間違ったツールを使用するのが好きですか? 私はいくつかのコードを貼り付けることができますが、私がやっていることが価値があるかどうか疑問に思っています。
更新: コード スニペットと pix
] 1
赤い円は、複数の名について話していることです。それらはテーブル内のさまざまなエントリに対応していますが、コンプリータは 1 つの列に制限されています。クリックしてユーザーの名前を取得するという点では、ほとんどわかっているのは、形式とコンマの処理だけです。
これが私の完成クラスの一部です:
class CustomQCompleter(QCompleter): #dropdown box of suggestions
def __init__(self, parent=None,*args):#parent=None):
self.columnind=0
super(CustomQCompleter, self).__init__(*args)
self.parent=parent
self.setCompletionColumn(self.columnind)
def pathFromIndex(self,index,role=QtCore.Qt.DisplayRole): #decides what gets put into selection box
#print(index)
model=self.source_model
return model.data(model.index(index.row(),self.columnind),role=QtCore.Qt.DisplayRole)
def splitPath(self, path):
self.local_completion_prefix = path #???
print(path)
sp=self.local_completion_prefix.split(',')
if len(sp)>1: #
print('path split')
return sp
return [path]
そして、これが私の再実装されたプロキシモデルのacceptsrowです:
def filterAcceptsRow(self, row_num, parent): #input matches if this returns true
self.filterString=self.parent().inp.text()
self.filterList=[i.strip() for i in self.filterString.split(',')]
l=len(self.filterList)
while l<2:#easiest way to get thru this atm, clean up later
self.filterList.append('')
l=len(self.filterList)
if self.baseModel is not None:
model=self.baseModel
else:
model = self.sourceModel() # the underlying model,
# implmented as a python array
row = [model.data(model.index(row_num,0)),model.data(model.index(row_num,1))] #gets the data for this row from sql model in list format
#(row[0] starts with fname and row[1] starts w lname) OR vice versa
tests=[row[0].startswith(self.filterList[i]) and row[1].startswith(self.filterList[1-i]) for i in [0,1]]
#tests = len(self.filterSet.intersection(set([row[col] for col in self.filterColumns])))==2
# print(tests)
return True in tests
理想的には、次のようになります。