我正在尝试将一些代码从 PyQt5 移植到 PySide2。我遇到了 TreeWidget 的一些对象生命周期问题。我显然不明白一些事情。当我尝试从模型中访问树中选定项目的数据时,我收到“内部 C++ 对象已删除错误” - 但据我所知,我已确保我对项目数据有当前引用范围。
下面的测试用例演示了这个问题。当用户从树中选择项目然后单击按钮时,会报告以下错误:
Traceback (most recent call last):
File "test_case.py", line 33, in button_clicked
self.tree.selectionModel().selection()[0]
RuntimeError: Internal C++ object (PySide2.QtCore.QAbstractItemModel) already deleted.
显然有些东西超出了范围,但我看不到在哪里。
我如何防止模型中的项目被删除?
from PySide2.QtWidgets import (QApplication, QMainWindow, QAbstractItemView,
QPushButton, QVBoxLayout, QGroupBox,
QTreeWidget, QTreeWidgetItem)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.tree = QTreeWidget(self)
self.button = QPushButton(self, text="Run Tests")
self.vbox = QVBoxLayout(self)
self.vbox.addWidget(self.tree)
self.vbox.addWidget(self.button)
self.frame = QGroupBox(self, title="Test &Run")
self.frame.setLayout(self.vbox)
self.button.clicked.connect(self.button_clicked)
self.setCentralWidget(self.frame)
self.item = QTreeWidgetItem(self.tree)
self.item.setText(0, "list item 1")
self.show()
def button_clicked(self):
data = self.tree.selectionModel().model().data(
self.tree.selectionModel().selection()[0]
)
if __name__ == "__main__":
app = QApplication([])
app.mainWindow = MainWindow()
app.exec_()
环境:Linux Python 3.5 conda PySide 5.6.0a1 qt 5.6.2
更新:我检查了最新的 PySide2 (5.11a1) 开发版本中是否发生了同样的问题,并提出了错误报告PYSIDE-639