QTreeWidget使用过程中经常会需要对Item进行编辑,目前比较方便的是双击Item,然后Item呈现编辑的状态,完成编辑后更新Item的内容。要实现这样的功能,其实只要将Item设置为可编辑即可,但是QTreeWiget默认的可编辑状态不好看,因此我们需要对可编辑的状态重新定义,这里仍然用到代理绘制。首先看效果图:

原始加载的图如下:

双击编辑的图:

编辑完成后的图:

下面详细介绍实现:
1 添加Item时设置为可编辑

zhangsanroot->setFlags(zhangsanroot->flags() | Qt::ItemIsEditable);

2 为树设置代理绘制

ui->treeWidget->setItemDelegate(new TreeDelegate(0));

3 代理绘制具体实现
一个自定义的delegate也可以直接提供一个编辑器,而不是使用内置的编辑器工厂(editor item factory)。如果你需要这种功能,那么需要实现一下几个函数:

createEditor(): 返回修改数据的组件;
setEditorData(): 为editor提供编辑的原始数据;
setModelData(): 根据editor 的数据更新model的数据。

头文件实现如下:

#include<QStyledItemDelegate>
class TreeDelegate :  public QStyledItemDelegate
{Q_OBJECT
public:TreeDelegate( int durationColumn, QObject *parent = 0);void paint(QPainter *painter,  const QStyleOptionViewItem &option,  const QModelIndex &index)  const;QWidget *createEditor(QWidget *parent,  const QStyleOptionViewItem &option,  const QModelIndex &index)  const;void setEditorData(QWidget *editor,  const QModelIndex &index)  const;void setModelData(QWidget *editor, QAbstractItemModel *model,  const QModelIndex &index)  const;
private slots:void commitAndCloseEditor();
private:int durationColumn;
};

CPP代码实现如下:

TreeDelegate::TreeDelegate(int durationColumn, QObject *parent): QStyledItemDelegate(parent)
{this->durationColumn = durationColumn;
}/*此处paint函数可不重写*/
void TreeDelegate::paint(QPainter *painter,  const QStyleOptionViewItem &option,  const QModelIndex &index)  const
{QStyledItemDelegate::paint(painter, option, index);
}/*编辑器是一个LineEidt*/
QWidget *TreeDelegate::createEditor(QWidget *parent,  const QStyleOptionViewItem &option,  const QModelIndex &index)  const
{if (index.column() == durationColumn) {QLineEdit *nameEdit =  new QLineEdit(parent);connect(nameEdit, SIGNAL(editingFinished()),  this, SLOT(commitAndCloseEditor()));return nameEdit;} else {return QStyledItemDelegate::createEditor(parent, option, index);}
}void TreeDelegate::commitAndCloseEditor()
{QLineEdit *editor = qobject_cast<QLineEdit *>(sender());if(editor->text() == ""){return;}emit commitData(editor);emit closeEditor(editor);
}/*默认为空*/
void TreeDelegate::setEditorData(QWidget *editor,  const QModelIndex &index)  const
{if (index.column() == durationColumn) {QLineEdit *nameEdit = qobject_cast<QLineEdit *>(editor);nameEdit->setText("");}  else {QStyledItemDelegate::setEditorData(editor, index);}
}/*编辑器有输入值时则更新数据*/
void TreeDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,  const QModelIndex &index)  const
{if (index.column() == durationColumn) {QLineEdit *nameEdit = qobject_cast<QLineEdit *>(editor);if(nameEdit->text() == ""){return;}model->setData(index, nameEdit->text());}  else {QStyledItemDelegate::setModelData(editor, model, index);}
}

QTreeWidget支持双击编辑Item节点的内容相关推荐

  1. flex之鸡肋功能——双击编辑列内容

    flex中的DataGrid是支持单击编辑单元格内容的,不过这确实不够方便,单击是选中数据的,怎么能变成修改呢!在网上查了看,利用一个DataGrid组件,可以实现双击修改 此组件源码为: Doubl ...

  2. html双击变成可编辑,jquery 实现双击编辑并保存

    jquery 实现双击编辑并保存 Jesse 2013-12-11 19:47:00 1153 最近在做一个数据修改的例子,一个个点开修改很麻烦,于是就想到ecshop后台里的 只需单击就以编辑了,在 ...

  3. 双击treeView的节点时使不展开不折叠子节点

    有时候我们对树控件的双击默认操作不太满意,比如我们在双击一有子节点的节点的时候不希望打开或关闭它的子节点而想执行一个特定的操作,这时怎么来写呢,我这里有一个办法可以做到这一点: using Syste ...

  4. Flex DataGrid双击编辑单元格

    flex中的 DataGrid是支持单击编辑单元格内容的,不过这确实不够方便,单击是选中数据的,怎么能变成修改呢!在网上查了看,利用一个 DataGrid组件,可以实现双击修改 此组件源码为: Dou ...

  5. java 实现在线编辑本地pdf文件内容

    功能描述:将pdf文件上传到服务器,然后服务器读取上传的pdf文件内容,然后渲染到在线富文本中,再然后在富文本中修改完毕点击保存,再将上传的pdf文件内容修改为在线富文本中的内容 1.实现将PDF文件 ...

  6. 实现双击编辑input

    前端实现双击编辑Input 照猫画虎系列-请使用cv大法 <!DOCTYPE html> <html lang="en"> <head>< ...

  7. dedecms织梦专题节点列表内容怎么实现分页

    这篇文章主要介绍dedecms织梦专题节点列表内容怎么实现分页,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  dedecms织梦专题节点列表内容怎么实现分页?  方法:  打 ...

  8. 如何编辑二维码内容并批量生成

    随着社会的发展,更加智能的二维码使用也变得越来越普遍,那么我们所看到的五颜六色或者各种样式的二维码都是如何添加内容和制作的呢?下面我们就中琅二维码软件来看一下如何编辑二维码内容并且实现批量生成的方法: ...

  9. JS单击/双击编辑功能

    JS单击/双击编辑功能 HTML <!DOCTYPE html> <html lang="en"> <head><meta charset ...

  10. Yjs + quill:快速实现支持协同编辑的富文本编辑器

    大家好,我是前端西瓜哥,这次来看看 Yjs 如何帮助我们实现协同编辑能力的. Y.js 是一个支持 协同编辑 的开源库.只要我们将自己的数据转换为 Y.js 提供的 Y.Array.Y.Map 类型, ...

最新文章

  1. vant 项目_如何搭建mpvue框架搭配vant组件库的小程序项目
  2. 可以从max中导出静态模型并渲染了。
  3. 坐标偏差大_控制点的坐标复核(二)
  4. opengl加载显示3D模型PLY类型文件
  5. php background-image,css background-image属性怎么用
  6. python中range函数和xrange函数有什么异同?
  7. “谷歌杀手”发明者,科学天才 Wolfram
  8. Java菜鸟教程 一些简单的练习
  9. VxLAN技术基本原理
  10. B站粉丝数显示器,播放数、获赞数失效解决。
  11. 通过ajax异步请求下载文件的方法
  12. java咖啡平台,22年最新
  13. PC历史上的20位英雄
  14. 被尘封的故事技能点bug_12个人闯进失落的世界,发现了尘封盛世的秘密
  15. Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
  16. 无锡计算机办公软件培训班,无锡文员办公软件培训周末班,电脑办公速成班
  17. 车险往年保单关联计算的性能优化 1
  18. python 函数式 panda_函数式
  19. RN FlatList
  20. 【安全播报】微信突然变静音要谨慎,多人银行卡内余额被转走

热门文章

  1. 关于小米手机用微信会重启的问题
  2. 语音(一)| 语音识别基础(深度解析)
  3. Python电影票房数据可视化分析基础实践
  4. QQ小程序加QQ群和加好友
  5. 卡尔曼滤波原理图文详解
  6. 常用的网络上的 webservice 地址
  7. 高数——关于微分方程共轭复根引发的复数思考
  8. 英尺英寸和厘米的换算_C语言中关于英尺、英寸、厘米的换算
  9. wieshark导出ftp文件_【FTP】Wireshark学习FTP流程
  10. ps链接图层的使用方法和快捷键,ps图层链接怎么做的