2016-09-02 6 views
0

の入力/戻りキーが押されたときに、選択したボックスをチェックするチェックボックスを使ってリストビューを作成しようとしています。私は私がなし値はitemFromIndexメソッドから返されますeventfilterで(はい、私はそれをサブクラス化するはずが、私が働いていることを得ることができませんでした)私のメインウィンドウのためのeventfilterのオーバーライドでQStandardItemModelのitemFromIndexメソッドがNoneを返すのはなぜですか? (インデックス無効)

これを行います.isValid()で問題なくインデックスを通過したにもかかわらず、明らかに私は何かを見逃しているが、私はそれを理解することができない - それは全く異なる指数を見ているのだろうか?モデルは更新されていませんか?代替アプローチに関する

何かアドバイスは私がファイルを読み込むときには、それが唯一と呼ばれています、私はアイテムを持つモデル(QStandardItemModel)を埋めるために使用する方法である

歓迎されています。

def update_siNLV(self,names,model): 

     model.clear() 

     for name in names:    
      item = Qg.QStandardItem(name) 
      item.setCheckState(Qc.Qt.Unchecked) 
      item.setCheckable(True) 
      model.appendRow(item) 

これはeventFilter方法はこれとフィルタリングのように見える私はselectionModelのための変数を作成のinit方法からのものであり、私のQListView

self.sigInSelection = self.siNLV.selectionModel() 
    self.siNLV.installEventFilter(self) 

にeventfilterをインストールメソッドの一部が機能します(Enterキーを押しながら選択したインデックスを印刷するようにしました)

def eventFilter(self,receiver,event): 
     if event.type() == QtCore.QEvent.KeyPress: 
      if event.key() == QtCore.Qt.Key_Return or event.key() == Qc.Qt.Key_Enter: 

       indexes = self.sigInSelection.selectedIndexes() 

       for index in indexes: 
        if index.isValid():       
         print(str(index.row())+" "+str(index.column()))         
         item = self.sigInModel.itemFromIndex(index) 
         item.setCheckState(qtCore.Qt.Checked)      
       return True 

    return super(form,self).eventFilter(receiver,event) 
+1

あなたは 'index'が' sigInSelection'の有効なインデックスであることを確認しているようです - 先験的*理由もなく、 'sigInModel'の有効なインデックスでなければなりません。 –

+0

あなたは正しいです。したがって、 'sigInModel'がlistviewに設定されていても、組み込みのセレクションモデルであるsiNLVとインデックスを共有しませんか?それでは、私の選択肢を私のデータにどのように結びつけるのですか? –

+0

'eventFilter'が機能していると言うので、' itemFromIndex'をどこで呼び出すのか分かりません。おそらくもう少しコードを見る必要があります。 MVCEが役に立ちます。 – strubbly

答えて

0

コメントで議論したように:

QItemSelectionModel.selectedIndexes()によって返されるインデックスは、ビューから来て、ビューとその直接モデルとの間の接続に関連しています。そのモデルのアイデンティティはQModelIndex.model()を呼び出すことによって見つけることができ、この場合は、あなたが望むモデルではありません。それはあなたの希望のQStandardItemModelとそのビューの中間にあるプロキシモデルです。

モデルにアクセスするには、QAbstractProxyModel.mapToSource()を使用する必要があります。

source_index = self.proxy.mapToSource(index) 
item = self.sigInModel.itemFromIndex(source_index) 

より一般的にはあなたが任意のプロキシ構造を通過する可能など、コードの何かによって、単一の知られているプロキシのこのハードコードされた使用を避ける:だから、このようなコードのものを使用する場合があります

proxy_model = index.model() 
while proxy_model != self.sigInModel: 
    index = proxy_model.mapToSource(index) 
    proxy_model = index.model() 
item = self.sigInModel.itemFromIndex(index) 

しかし、この場合、シンプルな単一プロキシがあることがわかっている場合、これはおそらく過剰です。

関連する問題