gpt4 book ai didi

python - PyQt5 QStandardItem 存储旧父项

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:46 28 4
gpt4 key购买 nike

使用 PyQt 5,我一直在尝试找到一种方法,使用 QStandardItemModel 和 QStandarItems 从 QTreeView 情况下的项目上的拖放操作中获取旧父级。

如果可能的话,我真的想避免创建自己的模型。

我当前的尝试是在将当前父项创建为“旧父项”时将其存储在项目中,并且不应在移动中更新它,以便我可以引用它更新旧父项中的值,然后更新移动项目中的“旧父项”到新的当前父项。

我似乎无法让它工作,这是我在创建项目时尝试用来存储“旧父级”的代码:

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

当我运行此命令时,我收到以下错误:

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

此时我无法引用旧的父级......

我找到了一个使用 c++ 的引用文献和大量“指针转换”,但我不知道如何将代码转换为 Python 和 PyQt 5。

C++ 引用:https://forum.qt.io/topic/1690/qvariant-save-load-unable-to-save-type-x/19

感谢您的帮助!

最佳答案

该模型有 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_())

关于python - PyQt5 QStandardItem 存储旧父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41518466/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com