モデルには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_())
:ここ
は、基本的なデモスクリプトです無効にされました。したがって、このタイプのアプローチは、どのように実装されていても機能しません。あなたがこれを行うことで解決しようとしている実際の問題は何ですか? – ekhumoro
私は列から項目の行を削除し、それをツリー内の別の場所にドロップすると、列の合計を更新しようとしています。各親ノードには、列内の子アイテムの合計を保持する合計アイテムがあります。項目の内外を移動するたびに、その合計アイテムを更新しようとしています。これが意味をなさないことを願っています! – Zexelon