我有一个向QTreeView显示JSON文件的应用程序。为此,我为QTreeView模型创建了自己的QTreeView类
在我的MainWindow.py中,我这样实现了它:
class MainWindow(QMainWindow):
def __init__(self, json_text: dict) -> None:
self.tree_view = QTreeView()
self.model = QJsonTreeModel()
self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu)
self.tree_view.customContextMenuRequested.connect(self.open_right_click_menu)
self.tree_view.setModel(self.model)
self.model.load(self.json_text)
def open_right_click_menu(self, position) -> None:
index = self.tree_view.selectionModel().currentIndex()
parent = index.parent()
if not index.isValid():
return
# workes fine
print(self.model.data(self.tree_view.selectedIndexes()[2], Qt.EditRole))它工作得很好,但最近我需要添加search QLineEdit()字段来查找树中的输入元素。在这个任务中,我找到了QSortFilterProxyModel()的灵魂。我是这样实现的:
class MainWindow(QMainWindow):
def __init__(self, json_text: dict) -> None:
self.tree_view = QTreeView()
self.line_edit = QLineEdit()
self.model = QJsonTreeModel()
self.model.load(self.json_text)
self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu)
self.tree_view.customContextMenuRequested.connect(self.open_right_click_menu)
self.filter_proxy_model = QSortFilterProxyModel()
self.filter_proxy_model.setSourceModel(self.model)
self.filter_proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive) # Qt.CaseSensitive
self.filter_proxy_model.setRecursiveFilteringEnabled(True)
self.filter_proxy_model.setFilterKeyColumn(-1)
self.tree_view.setModel(self.filter_proxy_model)
self.line_edit.textChanged.connect(self.filter_proxy_model.setFilterRegExp)
def open_right_click_menu(self, position) -> None:
index = self.tree_view.selectionModel().currentIndex()
parent = index.parent()
if not index.isValid():
return
# not working rn. Segmentation fault
print(self.model.data(self.tree_view.selectedIndexes()[2], Qt.EditRole))
# also not working
print(self.filter_proxy_model.sourceModel().data(self.tree_view.selectedIndexes()[2], Qt.EditRole))它工作良好,输入文本在树中被搜索并正常显示,但问题在其他地方。我已经为我的QTreeView实现了右键单击菜单:
self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu)
self.tree_view.customContextMenuRequested.connect(self.open_right_click_menu)在open_right_click_menu函数中,我需要调用self.model.data(self.tree_view.selectedIndexes()[2], Qt.EditRole) (索引是正确的,有三列)函数,或者在添加QSortFilterProxyModel()之前完全工作的其他QJsonTreeModel()类函数。但是在实现QSortFilterProxyModel()后,当我试图调用QJsonTreeModel()类的某个函数时,就出现了分割错误。此外,我尝试了self.filter_proxy_model.sourceModel().data(self.tree_view.selectedIndexes()[2], Qt.EditRole),但它也会导致分割错误。哪里错了,如何正确调用QJsonTreeModel()类的函数?
发布于 2022-08-19 11:47:46
在我问我的问题之前,我没有找到this的问题,但问题是我没有把QSortFilterProxyModel映射回去。所以解决办法是:
def open_right_click_menu(self, position) -> None:
# not working version
print(self.model.data(self.tree_view.selectedIndexes()[2], Qt.EditRole))
# working version
print(self.model.data(
self.filter_proxy_model.mapToSource(self.tree_view.selectedIndexes()[2]), Qt.EditRole))https://stackoverflow.com/questions/73413392
复制相似问题