能否让QStandardItem在一个视图可编辑,另一个视图不可编辑?
问题分析与解决方案
首先得明确:你原代码里的逻辑有问题——QStandardItem不能同时属于两个QStandardItemModel,当你把同一个item加到第二个模型时,它会自动从第一个模型中移除(因为每个项只能有一个父项),最终只有第二个模型里有这个项,两个视图不会同时显示同一个项。
要实现“两个视图都能查看,仅一个可编辑”,有两种靠谱的实现方式:
方法一:共享同一个模型(推荐)
这种方式最简单,数据天然同步,只需要控制其中一个视图的编辑权限即可:
代码示例
from PyQt5.QtWidgets import QApplication, QTreeView, QStandardItemModel, QStandardItem import sys app = QApplication(sys.argv) # 创建单个模型和项 item_model = QStandardItemModel() item = QStandardItem("my item") item_model.appendRow(item) # 视图1:默认可编辑 view_1 = QTreeView() view_1.setModel(item_model) view_1.show() # 视图2:仅查看不可编辑 view_2 = QTreeView() view_2.setModel(item_model) # 禁用所有编辑触发行为 view_2.setEditTriggers(QTreeView.NoEditTriggers) view_2.show() sys.exit(app.exec_())
关键说明
- 两个视图绑定同一个模型,数据自动同步,修改其中一个视图的内容,另一个会立刻更新。
- 通过
setEditTriggers(QTreeView.NoEditTriggers)直接禁用视图2的编辑功能,操作简单直接。
方法二:使用两个独立模型(需手动同步)
如果因为某些原因必须用两个模型,那需要复制项,设置其中一个项不可编辑,同时监听模型的dataChanged信号来同步两个模型的内容:
代码示例
from PyQt5.QtWidgets import QApplication, QTreeView, QStandardItemModel, QStandardItem from PyQt5.QtCore import Qt import sys app = QApplication(sys.argv) # 创建第一个模型(可编辑) item_model_1 = QStandardItemModel() item_1 = QStandardItem("my item") item_model_1.appendRow(item_1) # 创建第二个模型(仅查看) item_model_2 = QStandardItemModel() item_2 = QStandardItem(item_1.text()) # 移除项的可编辑标志 item_2.setFlags(item_2.flags() & ~Qt.ItemIsEditable) item_model_2.appendRow(item_2) # 监听第一个模型的变化,同步到第二个模型 def sync_to_model_2(index, _): if index.column() == 0: item_2.setText(index.data()) item_model_1.dataChanged.connect(sync_to_model_2) # 视图1:绑定可编辑模型 view_1 = QTreeView() view_1.setModel(item_model_1) view_1.show() # 视图2:绑定不可编辑模型 view_2 = QTreeView() view_2.setModel(item_model_2) view_2.show() sys.exit(app.exec_())
关键说明
- 两个模型用独立的
QStandardItem,避免了同一个项属于多个模型的冲突问题。 - 给
item_2移除ItemIsEditable标志,确保它无法被编辑。 - 通过
dataChanged信号监听第一个模型的修改,同步到第二个模型,保证两个视图显示内容一致。
内容的提问来源于stack exchange,提问作者DJames
相关产品推荐
相关产品推荐

