あなたが言ったように、今あなたはあなたの QTableView.selectionChanged() が選択をあなたのマットプロットに送り返しています。最も効率的なアプローチは、関連するアイテムを使用して、マットプロットに選択のシグナルを送信させることです。
テーブルビューはすでにその選択を QItemSelectionModel に保存しているため、私が見る限り、アイテムに独自の isSelected 属性を保存することは冗長で不要です。matplot ビューは、使用している項目を認識し、テーブル ビューに選択の変更を通知できる必要があります。
matplot ビューには、出力するシグナル ( など) が含まれているselectionChanged(items)
可能性があり、テーブル ビューに関する知識がなくても続行できます。
テーブルビューは、マットプロットビューについて既に知っているため、マットプロットに接続してselectionChanged(items)
選択の変更をリッスンできます。テーブルも信号を発していて、マットプロットの知識がない場合でも、親クラスがそれらの両方を知っていれば、接続を確立できます。
これが、属性が必要ないと私が考える理由です。その属性を利用する唯一の方法は、モデル全体をスキャンし、各アイテムをチェックすることです。それは本当に効率的ではありません。選択は、発信されたシグナルに反応して行われるべきです。
myMatPlotView.selectionchanged.connect(myTableView.matplotSelected)
また、matPlotSelected()
スロットでは、選択モデルを使用してアイテムの選択を設定できます。
テーブルビュー
def matPlotSelected(self, qStandardItems):
selModel = self.selectionModel()
model = self.model()
for item in qStandardItems:
idx = model.indexFromItem(item)
selModel.select(idx, selModel.Select)
アップデート
コメントでは、コード スニペットを提供しました。これは、達成したいことを分離するのに本当に役立ちました。
あなたの例
def __init__(self):
super(myDialog, self).__init__()
self.t = QtGui.QTreeView()
self.m = QtGui.QStandardItemModel()
self.t.setModel(self.m)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.t)
self.setLayout(layout)
self.l = [
['one', False], ['two', True],
['three', False], ['four', True],
['five', False]]
self.populate()
def populate(self):
self.m.clear()
root = self.m.invisibleRootItem()
for item in self.l:
e = QtGui.QStandardItem()
e.setText(item[0])
root.appendRow(e)
これがあなたの実際の状況である場合、上記で提案したことは次のように当てはまります。
def populate(self):
self.m.clear()
root = self.m.invisibleRootItem()
selModel = self.t.selectionModel()
for item in self.l:
e = QtGui.QStandardItem()
e.setText(item[0])
root.appendRow(e)
if item[1]:
idx = self.m.indexFromItem(e)
selModel.select(idx, selModel.Select)