PySide6中QModelIndex.internalPointer()调用崩溃,求问题排查
QModelIndex.internalPointer()调用导致PySide6程序崩溃
问题详情
需要通过GUI访问并编辑树形结构的复杂异构数据,使用QTreeView浏览数据结构,选中数据集后打开独立视图编辑。自行继承QAbstractItemModel实现了自定义模型,同时编写了自定义树形项类来访问数据集,QTreeView可正常加载并显示数据结构。但尝试通过模型访问数据集时,调用QModelIndex.internalPointer()会导致程序无异常直接崩溃。调试简化代码后,即使使用QStandardItemModel和QStandardItem,崩溃问题仍然存在。
复现问题的极简代码:
import sys from PySide6 import QtGui, QtWidgets app = QtWidgets.QApplication(sys.argv) tree = QtWidgets.QTreeView() model = QtGui.QStandardItemModel() item = QtGui.QStandardItem('item') model.appendRow(item) tree.setModel(model) tree.show() # 此调用正常 print(item.index().constInternalPointer()) # 此调用导致崩溃 print(item.index().internalPointer()) sys.exit(app.exec())
原因分析
PySide6对Qt的QModelIndex::internalPointer()方法的绑定存在内存管理层面的问题,直接调用该方法会触发非法内存访问,导致程序崩溃。而constInternalPointer()作为其const版本,PySide6的绑定实现处理更安全,不会出现此类问题。
解决方法
- 直接替换
internalPointer()的调用为constInternalPointer(),两者在获取内部指针的功能上完全一致,且后者在PySide6环境下稳定可用。 - 若使用自定义模型,确保在实现
index()方法时,传入的内部指针对象生命周期由Python正确管理(比如避免C++侧对象被提前销毁),同时在Python中操作该指针指向的对象时,遵循PySide6的对象交互规则。
内容的提问来源于stack exchange,提问作者flho
相关产品推荐
相关产品推荐

