0

テーブルモデルの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   

理想的には、次のようになります。

ここに画像の説明を入力

4

1 に答える 1