1,QTreeView 也要设置编辑操作类型:

ui->treeView->setEditTriggers(QTreeView::DoubleClicked);			//单元格双击编辑

2,元素的 flags 要加可编辑属性: Qt::ItemIsEditable

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
    if (!index.isValid())
        return 0;
    //节点是否允许编辑
    Qt::ItemFlags flags = QAbstractItemModel::flags(index);
    flags |= Qt::ItemIsEditable;
    return flags;

3,另外data 函数里,也需要对 Qt::EditRole 处理下,否则打开编辑框时,默认是空白。

这里我们让编辑框默认就显示 item 的文本。

QVariant TreeModel::data(const QModelIndex &index, int role) const
    if (!index.isValid())
        return QVariant();
    TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
    if (role == Qt::DisplayRole)
        return item->data(index.column());
    else if (role == Qt::EditRole)
        //元素打开编辑框时,显示的内容,如果没有这行,编辑框出现时默认为空白
        return item->data(index.column());
    else if( role == Qt::TextAlignmentRole )
        if( index.column() == 0 )
            //第1列左对齐
            return QVariant(Qt::AlignVCenter | Qt::AlignLeft);
        else if( index.column() > 0 && index.column() < 6 )
            //第2~6列右对齐
            return QVariant(Qt::AlignVCenter | Qt::AlignRight);
            //其他列居中对齐
            return QVariant(Qt::AlignCenter);
    else if(role == Qt::TextColorRole)
        if(index.column() == 6)
            QString str = item->data(6).toString();
            if(str == QStringLiteral("不合格"))
                //第7列(是否合格)如果不合格就设文本为红色
                return QVariant(QColor("#FF0000"));
        return QVariant();
    return QVariant();

4,setData 函数,就是编辑框输入完后,应用时走的逻辑,我们去修改真实数据:

bool TreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
    if (index.isValid() && role == Qt::EditRole)
        TreeItem *item = static_cast<TreeItem*>(index.internalPointer());
        item->setData(index.column(), value);
        emit dataChanged(index, index);
        return true;
    return false;

其中调用TreeItem 进行真正的修改:

可以看到真实数据只有这几个,因此也只能修改这几个数据。其他数据会在显示时自动计算的。

void TreeItem::setData(int column, QVariant value)
    if(mLevel == 1)
        //一级节点,班级
        if(column == 0)
            CLASS* c = (CLASS*)mPtr;
            c->name = value.toString();
    else if(mLevel==2)
        //二级节点学生信息
        STUDENT* s = (STUDENT*)mPtr;
        switch (column)
        case 0: s->name = value.toString();break;
        case 1: s->score1 = value.toInt();break;
        case 2: s->score2 = value.toInt();break;
        case 3: s->score3 = value.toInt();break;
        default:
            return ;


写作不易,源码有偿提供:(注意链接是全套专栏完整源码,请勿重复下载)

https://mianbaoduo.com/o/bread/YZuTk5dx

欢迎入群交流:
群号码:1149411109 (若满加2群:917341904)
群名称:Qt实战派学习群

1,简介之前发布的两篇自定义model的文章,有小伙伴下载源码后发现元素不能编辑。确实是的,因为我自己都是用来展示数据,没做这个。这篇文章实现item编辑功能。2,效果但是由于我这个示例,真实数据只有名称、三门课成绩,后面的展示数据都是根据这些实时计算出来的。因此只有真实数据支持修改,而且修改后 其他推算型数据也会自动刷新。这点需要注意。3,代码主要需处理下面几个地方:1,QTreeView 也要设置编辑操作类型:ui-&gt;tre
通过connect()把QTreeView 与对应的Model联系起来,在此之前必须先使用QTreeView的setModel()设置模式。 下面的代码达不到要求的效果: connect(model,SIGNAL(reset()),treeView,SLOT(expandAll())); treeView->setModel(model); 正确的做法是: treeView-
Tree view与Tree Widget 相比而言,需要为tree view 设置一个model使用tree view 能有效降低内存的使用率。但是需要自定义model。下面参考Qt官方提供的demo,讨论如何自定义Tree View Model。 依据名为simple tree model官方demo可知道:要自定义tree view model需要定义一个树形结构的底层数据结构,该类型结...
### 回答1: QTreeView是Qt中的一个控件,用于显示树形结构的数据。而自定义Model是指用户可以自己编写一个继承自QAbstractItemModel的类,用于管理数据,并提供给QTreeView显示。 通过自定义Model,用户可以更加灵活地管理数据,并且可以根据自己的需求定制数据的显示方式。同时,自定义Model也可以实现一些高级功能,比如数据的过滤、排序等。 在使用QTreeView时,通常需要先创建一个自定义Model,并将其设置为QTreeViewModel。然后,通过实现自定义Model中的一些方法,比如rowCount()、columnCount()、data()等,来管理和显示数据。最后,将QTreeView添加到窗口中,即可显示树形结构的数据。 ### 回答2: QTreeView是Qt中的一个控件,用于显示树形结构的数据,同时支持对树形数据的展开和收起、排序、拖放等操作。而自定义model则是指在QTreeView使用定义的数据模型(比如继承自QAbstractItemModel),以便更好地满足特定需求,如多层次结构的数据展示、自定义的排序和筛选规则等,从而提高应用的灵活性和可扩展性。 使用QTreeView和自定义model的基本步骤如下: 1.创建QTreeView控件,并设置其父控件。 2.创建自定义model,继承自QAbstractItemModel,并实现其纯虚函数(data、index、parent等)。 3.将自定义model关联到QTreeView中,使用setModel函数来完成,如“treeview->setModel(model)”。 4.在自定义model中重写headerData函数,以便支持表头的显示和自定义表头的内容。 5.在自定义model中实现rowCount、columnCount等函数,以便返回数据的行数和列数。 6.在自定义model中实现data函数,以便为每个单元格提供数据,并支持必要的自定义颜色、字体等操作。 7.在自定义model中实现index、parent等函数,以便能够正确的根据数据的层级关系建立树形结构。 8.在需要进行操作(如排序、拖放、展开等)时,通过对model的接口进行调用,来实现对数据的控制和修改。 总之,使用QTreeView和自定义model可以方便地展示树形结构的数据,同时允许对数据进行更加灵活的控制和操作。对于复杂的数据结构和类型,使用定义model来更好地满足需求,并提高应用的易用性和可扩展性。 ### 回答3: QTreeView 是 PyQt5 中的一个控件,它用于显示数据列表。而自定义 model 则是 QTreeView 显示数据的一种方式。 QTreeView 默认使用的是 QModelIndexes 来获取数据。但是如果需要显示特殊形式的数据,如树形结构、自定义数据类型等,则需要自定义 model 对数据进行处理。 自定义 model 需要继承 QAbstractItemModel 这个类,并实现它的一些虚函数,比如 rowCount()、columnCount()、index()、parent()、data() 等。这些函数的主要作用是处理数据的存储和获取、节点的定位、节点的展开和收起、数据的显示等功能。自定义 model 真正的作用是将外部数据源与 QTreeView 相关联,使其能够展示外部数据。 在自定义 model 的过程中,最重要的一步是实现数据存储和管理的功能。这通常包括两个方面,一是对数据进行存储和索引,二是对数据进行增删改查的操作。数据存储和索引可以使用 PyQt5 中提供的数据结构,如 QHash、QList 等。数据操作可以通过实现一些特定的函数,比如 insertRows()、removeRows()、setData() 等。这些函数在 QTreeView 中调用后,将会更新数据,并刷新界面。 在使用定义 model 的时候,需要将该 modelQTreeView 相关联,方法是将 model 实例设置给 QTreeView 控件的 setModel() 函数。此时,QTreeView 将会使用model 实例来显示数据。 总之,使用定义 model ,可以灵活、方便地处理 QTreeView 中的数据,并将不同类型的数据展示出来。 但是创建一个有效的自定义 model 是一项有挑战性的任务,需要深入了解 QAbstractItemModel 的工作方式、各种函数的功能以及如何在大量数据下快速动态更新界面等等。