QTreeView的系类文章如下,可根据熟练程度自行食用
QTreeView的使用(一)
QTreeView的使用(二)
本章主要讲述的是自定义每一个树节点以及实现搜索高亮
PS.本文主要是依据 QTreeView的使用(二)上的代码改过来的!

写作思路

1、QItemDelegate与QAbstractItemModel的关系
2、QItemDelegate绘制自定义图案
3、完善之前的搜索栏,实现输入后高亮!
4、响应自定义图像

1、QItemDelegate与QAbstractItemModel的关系

Qt的QItemDelegate官方API
下面来简单说明一下各个函数的作用:
首先说一下下面几个函数

这几个函数的名字是不是很眼熟!回到我这篇看看!
QTreeView的使用(二)
在继承自QAbstractItemModel的模型类中,data()函数里,也就是下面这几个role,对应的分别就是上面这几个函数,我们可以通过上述这三个函数的painter,随意绘制想要的样式

def data(self, index, role):if not index.isValid():return QVariantitem = index.internalPointer()if role == Qt.DecorationRole:if len(item.childItems) != 0:return QIcon("floder.svg")else:return QIcon("node.svg")if role == Qt.CheckStateRole:if item.isShow is True:return Qt.Checkedelse:return Qt.Uncheckedif role == Qt.DisplayRole:return item.data(index.column())

另外,还有下面这个函数,他对应的就是节点的初始绘制

我以paint函数为例子,画一个如下样式的节点

    def paint(self, painter, option, index):super(ItemDelegate, self).paint(painter, option, index)radio = 1top = option.rect.top() + radioleft = option.rect.left() + radiowidth = option.rect.width() - 2 * radioheight = option.rect.height() - 2 * radiobar = QStyleOptionProgressBar()bar.rect.setRect(left, top, width, height)bar.state = QStyle.State_Enabledbar.progress = 80bar.minimum = 0bar.maximum = 100bar.textVisible = Truebar.text = str(bar.progress)bar.textAlignment = Qt.AlignCenterpbar = QProgressBar()QApplication.style().drawControl(QStyle.CE_ProgressBar, bar, painter, pbar)

简单说明一下几个关键点:
1、绘制例如上述这类的控件图案的时候,首先我们要找到控件对应的Style,官方给的有如下这些中的部分,可以自行尝试,博主仅仅试过ProgressBar和Button

2、设置对应Style 的一些常用参数,如上面的progress、text等等
3、找到Qt给定的控件原型,如上面的QProgressBar
4、利用QApplication.style().drawControl()将控件绘制出来!这里需要注意的是 QStyle.CE_ProgressBar 这个参数是要随不同的Style变更参数,不同Style对应什么参数自行查看QStyle官方API
绘制不同控件的方式大体就如上啦!!!!!!!!!!!!!!

2、QItemDelegate绘制自定义图案

如果我们不想画Qt自带的控件,想绘制自定义的控件要怎么办呢!!下面就来讲述自己绘制图像,我会以一个选中后显示文字为例子讲述
实现的效果如下

代码如下

    def drawDisplay(self, painter, option, rect, text):if (int(option.state) & QStyle.State_Selected) != 0:titleWidth = fm.width(text)top = rect.top() + 4left = rect.left() + titleWidth + self.textIntervalwidth = fm.width(self.enterContent)if left < self.parent().rect().width() - width:left = self.parent().rect().width() - width - self.scrollWidthheight = rect.height()font = QFont(QFont("仿宋", 8))painter.setFont(font)painter.setPen(self.enterColor)textRect = QRect(left, top, width, height)painter.drawText(textRect, 0, self.enterContent)

简单讲述一下实现的方式,概括起来两个点:1、选定绘制的rect 2、绘制对应的图案
以上面为例,我只是简单的绘制了一串文字,其中要说明一下,为了实现选中才显示,代码中用到了一个比较关键的代码:
if (int(option.state) & QStyle.State_Selected) != 0
用这句可以判断当前节点是否被选中

3、完善之前的搜索栏,实现输入后高亮!

未加高亮前的效果

加高亮之后的效果

  color = QColor(0x05, 0x83, 0xe7, 0x99)painter.setPen(color)painter.setBrush(color)painter.drawRect(textRect)

实现的方式也很简单,同样是在drawDisplay这个方法里面,找到你搜索的文字,然后在那个地方画一个框!代码中的textRect就是你所搜索的文字的rect

4、响应自定义图像

在上面绘制的控件中,你会发现其实他是不响应点击事件的,具体原因没有去深究,那么此时我们该如何让其响应呢
QItemDelegate里有一个方法

这个方法会在我们编辑每个节点的时候,都会回调该方法,因此我们可以利用rect的特性,来实现点击回调!具体实现如下

    def editorEvent(self, event, model, option, index):if textRect.contains(event.pos()):if event.button() == Qt.LeftButton and event.type() == QEvent.MouseButtonPress:pass#TODOreturn super(ItemDelegate, self).editorEvent(event, model, option, index)else:return super(ItemDelegate, self).editorEvent(event, model, option, index)else:return super(ItemDelegate, self).editorEvent(event, model, option, index)

textRect其实就是我们上面绘制的我显示出来啦 的rect,这时我们就可以在TODO里面添加任意我们想回调的方法!

结语

应该还会有一篇关于QTreeView的使用,也是最后一篇!等我学会了就来!

QTreeView的使用(三)相关推荐

  1. (三)使用预定义模型QDirModel的例子

    目录: (一) Qt Model/View 的简单说明 .预定义模型 (二)使用预定义模型 QstringListModel例子 (三)使用预定义模型QDirModel的例子 (四)Qt实现自定义模型 ...

  2. Qt QTreeWidget/QTreeView去焦点(虚线框)

    Qt QTreeWidget/QTreeView去焦点(虚线框) QTreeWidget与QTreeView选中后会出现虚线框,也就是焦点. 解决方法一: QTreeView->setStyle ...

  3. 三、PyQt5高级控件的使用

    (四)PyQt5高级控件的使用 PyQt5中包含了很多用于简化窗口设计的可视化控件,除了常用控件外,还有一些关于进度.展示数据等的高级控件. 本章重点讲解PyQt5程序开发中用到的一些高级控件,主要包 ...

  4. QTreeview中虚线框解决办法(QWidget控件祛除焦点)

    QTreeview选中后出现虚线框,也就是焦点,一直祛除不了. 可用如下三种方式解决QTreeview焦点问题: 主要用QSS里面的outline:0px;该用法也适用于任何继承于的QWidget控件 ...

  5. 《使用QSortFilterProxyModel实现QTreeView行列过滤》:系列教程之十

    本文属于<QTreeView使用系列教程>之一,欢迎查看其它文章. 一.QSortFilterProxyModel简介 QSortFilterProxyModel的使用比较简单,我们在上一 ...

  6. QTreeView使用总结11,数据过滤,使用代理model,简单过滤

    1,简介 有时候需要对tree内的数据按一些条件进行过滤显示,比如按搜索条件过滤,这时候就用到了代理model. 通常使用Qt提供的 QSortFilterProxyModel 类,该类实现了常见的按 ...

  7. Hello Qt(三十三)——Model/View官方文档

    一.Model/View框架简介 Qt4推出了一组新的项视图类,使用Model/View框架来管理数据与表示层的关系.Model/View框架带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示 ...

  8. QStandardItemModel角色控制及QTreeView添加不同的右键菜单

    1.概述 QTreeView最长用的一个功能就是作为导航栏,像vs里的项目结构树,word的文档结构图,资源管理器的文档结构,等等都是利用树形结构组织的,在前面已经讲述了Qt中使用标准化项目模型QSt ...

  9. 伍六七带你学算法 进阶篇-三数之和

    三数之和 难度-中等 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  10. 远程控制virtual box虚拟机系统的三种方式

    远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...

最新文章

  1. git---gui使用
  2. python的薪资待遇-Python的就业薪资具体多少?发展前景到底如何?
  3. 计算机审计中级培训结业考试,第二期计算机审计中级培训班结业考.doc
  4. 如何修改WAMP中mysql默认空密码
  5. 玩转UITableView
  6. 汇编语言布尔表达式(NOT、AND、OR)
  7. 设备底座几个常见固定方式
  8. mongodb 启动脚本和配置
  9. 74.4k star 项目 YouTube-dl 重新上线,GitHub 强调将重点支持开源!
  10. SQL高级---SQL NULL 值
  11. Linux内核(4) - 内核学习的心理问题
  12. PDF文本内容批量提取到Excel
  13. excel中把汉字转换成拼音(只取首字母)
  14. 零基础学计算机编程教学视频教程,IT编程入门教程视频免费资源分享
  15. Jsoup爬虫以及防反爬
  16. 点扩散函数point spread function (PSF)
  17. Centos7.6搭建FTP服务器
  18. 【年度总结】——难忘的45天
  19. mysql grant什么意思_MySQL grant 语法的详细解析
  20. Google推出移动搜索 80亿网页、8亿图片尽在掌中

热门文章

  1. 算法复杂度中的O(logN)底数是什么?
  2. Elasticsearch也可以实现商品智能搜索实战
  3. NSLog使用,在release版本禁止输出NSLog内容
  4. C# 选项卡tabControl子项tabPage的显示和隐藏
  5. java接口回调实例
  6. linux进阶 --- chrony服务器
  7. 好恶心…飞机上吃剩下的东西去哪儿了?记者国际机场边发现惊天内幕!
  8. MyBatis里ResultMap丶ResultType的区别与ParameterType详解
  9. Linux基础入门知识
  10. 记录日志:腾讯云服务器遭遇挖矿病毒 清除操作日志