1

アイテムごとにカスタムデータ属性が追加された(グラフプロットデータ)の階層を含むモデルを持つQTableViewで任意の複数選択を行う最も効率的かつ技術的に(Python / PyQt4)正しい方法は何でしょう。QStandardItemsisSelected

isSelected詳細: テーブルに加えて、データに対応する範囲 (属性はこれらの範囲から直接取得)を出力する matplotlib プロットがありQTableView、これら 2 つの GUI 要素間に少し相互作用を追加したいと考えています。

つまり、matplotlib プロットの選択が反映されQTableView、その逆も同様です (これは、選択の変更を対応するインデックスの読み取りにフックし、それらをグラフ プロットにフィードバックすることで得られます)。

うまくいけば、この説明は理にかなっています。ありがとう。

4

1 に答える 1

1

あなたが言ったように、今あなたはあなたの 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)
于 2012-05-03T21:15:22.950 に答える