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->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,并将其设置为QTreeView的Model。然后,通过实现自定义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 的时候,需要将该 model 与 QTreeView 相关联,方法是将 model 实例设置给 QTreeView 控件的 setModel() 函数。此时,QTreeView 将会使用该 model 实例来显示数据。
总之,使用自定义 model ,可以灵活、方便地处理 QTreeView 中的数据,并将不同类型的数据展示出来。 但是创建一个有效的自定义 model 是一项有挑战性的任务,需要深入了解 QAbstractItemModel 的工作方式、各种函数的功能以及如何在大量数据下快速动态更新界面等等。