求GTK4中带EditableLabel可编辑单元格的ColumnView使用示例
ColumnView 搭配可编辑单元格(EditableLabel)更新模型示例
要实现ColumnView中每个单元格为可编辑标签并同步更新模型,核心是通过自定义委托实现编辑逻辑,以下是基于Qt(PyQt5)的完整可运行示例:
核心实现思路
ColumnView本身不直接提供可编辑单元格,需通过QStyledItemDelegate自定义编辑行为:
- 双击单元格时触发编辑模式,显示输入框(模拟EditableLabel效果)
- 编辑完成后将数据提交到模型,确保模型与视图同步
完整代码示例
from PyQt5.QtWidgets import (QApplication, QMainWindow, QColumnView, QStyledItemDelegate, QLineEdit, QStandardItemModel, QStandardItem) from PyQt5.QtCore import Qt class EditableDelegate(QStyledItemDelegate): def createEditor(self, parent, option, index): # 创建编辑输入框,替代默认编辑器 editor = QLineEdit(parent) return editor def setEditorData(self, editor, index): # 将模型当前数据加载到编辑器 text = index.model().data(index, Qt.DisplayRole) editor.setText(str(text)) def setModelData(self, editor, model, index): # 将编辑后的内容同步回模型 text = editor.text() model.setData(index, text, Qt.DisplayRole) def updateEditorGeometry(self, editor, option, index): # 让编辑器与单元格尺寸对齐 editor.setGeometry(option.rect) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("ColumnView 可编辑单元格示例") self.setGeometry(100, 100, 800, 600) # 初始化ColumnView控件 self.column_view = QColumnView(self) self.setCentralWidget(self.column_view) # 创建多层级示例模型(可替换为任意自定义模型) model = QStandardItemModel() root_item = model.invisibleRootItem() # 构建层级数据 for i in range(3): parent_item = QStandardItem(f"一级分类 {i+1}") parent_item.setEditable(True) root_item.appendRow(parent_item) for j in range(4): child_item = QStandardItem(f"二级项目 {i+1}-{j+1}") child_item.setEditable(True) parent_item.appendRow(child_item) for k in range(2): grandchild_item = QStandardItem(f"三级内容 {i+1}-{j+1}-{k+1}") grandchild_item.setEditable(True) child_item.appendRow(grandchild_item) # 为ColumnView设置自定义委托 delegate = EditableDelegate() self.column_view.setItemDelegate(delegate) # 关联模型与视图 self.column_view.setModel(model) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_()
关键说明
- 自定义委托:
EditableDelegate重写了委托的核心方法,确保编辑流程与模型数据双向同步 - 模型兼容性:示例使用
QStandardItemModel,如果是自定义模型,只要正确实现data()和setData()方法,该委托同样适用 - 编辑触发:双击任意单元格即可进入编辑模式,编辑完成后按下回车或点击其他区域,数据会自动更新到模型
内容的提问来源于stack exchange,提问作者Łukasz Grabski
相关产品推荐
相关产品推荐

