1

我正在尝试将一些代码从 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

4

0 回答 0