2017-01-07 10 views
1

PyQt 5を使用するQStandardItemModelとQStandarItemsを使用して、QTreeViewの状況で古い親をドラッグ&ドロップ操作から取得する方法を見つけようとしています。PyQt 5 QStandardItem古い親を保存する

可能であれば、自分のモデルを作成しないようにしたいと考えています。

私は、現在の親を「古い親」として作成したときにそのアイテムに現在の親を保存し、移動中に更新しないようにして、古い親アイテムの値を更新して参照できるようにします移動した項目の「古い親」を新しい現在の親に更新します。私はこれをしかし、実行すると

item.setData(parent.index(),(Qt.UserRole+3)) 

私はそれはしかし、ここで仕事を得るように見えることはできませんが、私はアイテムが作成され、「古い親」を記憶するために使用しようとしていますコードです次のエラーを取得する:

QVariant::save: unable to save type 'QModelIndex' (type id: 42).

と私は、この時点で古い親を参照することはできません...

を私は、C++と「ポインタのキャスト」の多くを使用して一つの参照が見つかりましたが、私はわかりませんでした任意の助けhttps://forum.qt.io/topic/1690/qvariant-save-load-unable-to-save-type-x/19

ありがとう:PythonとPyQtは5

C++リファレンスにコードを変換する方法を!

+0

:ここ

は、基本的なデモスクリプトです無効にされました。したがって、このタイプのアプローチは、どのように実装されていても機能しません。あなたがこれを行うことで解決しようとしている実際の問題は何ですか? – ekhumoro

+0

私は列から項目の行を削除し、それをツリー内の別の場所にドロップすると、列の合計を更新しようとしています。各親ノードには、列内の子アイテムの合計を保持する合計アイテムがあります。項目の内外を移動するたびに、その合計アイテムを更新しようとしています。これが意味をなさないことを願っています! – Zexelon

答えて

0

モデルにはsome signalsがあり、アイテムの子が挿入または削除されるたびに自動的に更新されます。

いくつかの実験の後、私はモデルが完全に更新する機会を持つように信号は、queued connectionで使用する必要があることがわかった:

model.rowsInserted.connect(slot, type=QtCore.Qt.QueuedConnection) 
model.rowsRemoved.connect(slot, type=QtCore.Qt.QueuedConnection) 

しかし、それ以外の、実装は非常に簡単です。アップデートは動的に実行できるので、アイテムに余分な情報を格納する必要はありません。すぐにドラッグアンドアイテムをドロップするように、そのすべての子供たち(とそのすべての子供たち、など)の保存されたインデックスはすぐになり、あなたの現在の試行で

from PyQt5 import QtCore, QtGui, QtWidgets 

class Window(QtWidgets.QTreeView): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove) 
     self.setDragDropOverwriteMode(False) 
     self.header().hide() 
     model = QtGui.QStandardItemModel(self) 
     model.rowsInserted.connect(
      self.sumItems, type=QtCore.Qt.QueuedConnection) 
     model.rowsRemoved.connect(
      self.sumItems, type=QtCore.Qt.QueuedConnection) 
     self.setModel(model) 
     parent = model.invisibleRootItem() 
     for index in range(3): 
      item = QtGui.QStandardItem('0') 
      parent.appendRow(item) 
      for row in range(1, 5): 
       child = QtGui.QStandardItem(str(row)) 
       item.appendRow(child) 
     self.expandAll() 

    def sumItems(self, index, first, last): 
     if index.isValid(): 
      total = 0 
      parent = self.model().itemFromIndex(index) 
      for row in range(parent.rowCount()): 
       child = parent.child(row) 
       if child is not None: 
        total += int(child.text()) 
      parent.setText(str(total)) 

if __name__ == '__main__': 

    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    window = Window() 
    window.setGeometry(700, 100, 250, 300) 
    window.show() 
    sys.exit(app.exec_()) 
+0

これはまさに私が探していたものです!私は完全にドキュメントWRT rowsInsertedとrowsRemovedを理解できませんでした。たとえば、モデルのrowCountはitem.appendRow()を使用してアイテムに子を追加しても変更されませんが、これらのシグナルはまだ送信されます... – Zexelon

関連する問題