You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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_()

关键说明

  1. 自定义委托:EditableDelegate重写了委托的核心方法,确保编辑流程与模型数据双向同步
  2. 模型兼容性:示例使用QStandardItemModel,如果是自定义模型,只要正确实现data()和setData()方法,该委托同样适用
  3. 编辑触发:双击任意单元格即可进入编辑模式,编辑完成后按下回车或点击其他区域,数据会自动更新到模型

内容的提问来源于stack exchange,提问作者Łukasz Grabski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:22:51