QTreeView的使用(三)
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的使用(三)相关推荐
- (三)使用预定义模型QDirModel的例子
目录: (一) Qt Model/View 的简单说明 .预定义模型 (二)使用预定义模型 QstringListModel例子 (三)使用预定义模型QDirModel的例子 (四)Qt实现自定义模型 ...
- Qt QTreeWidget/QTreeView去焦点(虚线框)
Qt QTreeWidget/QTreeView去焦点(虚线框) QTreeWidget与QTreeView选中后会出现虚线框,也就是焦点. 解决方法一: QTreeView->setStyle ...
- 三、PyQt5高级控件的使用
(四)PyQt5高级控件的使用 PyQt5中包含了很多用于简化窗口设计的可视化控件,除了常用控件外,还有一些关于进度.展示数据等的高级控件. 本章重点讲解PyQt5程序开发中用到的一些高级控件,主要包 ...
- QTreeview中虚线框解决办法(QWidget控件祛除焦点)
QTreeview选中后出现虚线框,也就是焦点,一直祛除不了. 可用如下三种方式解决QTreeview焦点问题: 主要用QSS里面的outline:0px;该用法也适用于任何继承于的QWidget控件 ...
- 《使用QSortFilterProxyModel实现QTreeView行列过滤》:系列教程之十
本文属于<QTreeView使用系列教程>之一,欢迎查看其它文章. 一.QSortFilterProxyModel简介 QSortFilterProxyModel的使用比较简单,我们在上一 ...
- QTreeView使用总结11,数据过滤,使用代理model,简单过滤
1,简介 有时候需要对tree内的数据按一些条件进行过滤显示,比如按搜索条件过滤,这时候就用到了代理model. 通常使用Qt提供的 QSortFilterProxyModel 类,该类实现了常见的按 ...
- Hello Qt(三十三)——Model/View官方文档
一.Model/View框架简介 Qt4推出了一组新的项视图类,使用Model/View框架来管理数据与表示层的关系.Model/View框架带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示 ...
- QStandardItemModel角色控制及QTreeView添加不同的右键菜单
1.概述 QTreeView最长用的一个功能就是作为导航栏,像vs里的项目结构树,word的文档结构图,资源管理器的文档结构,等等都是利用树形结构组织的,在前面已经讲述了Qt中使用标准化项目模型QSt ...
- 伍六七带你学算法 进阶篇-三数之和
三数之和 难度-中等 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...
- 远程控制virtual box虚拟机系统的三种方式
远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...
最新文章
- ORACLE分页SQL
- HTML中的一些知识点
- LeetCode 11 Container With Most Water
- Learning OpenCV Lecture 5 (Filtering the Images)
- 成功解决TypeError: __init__() got an unexpected keyword argument 'indices'
- Class.getResource()与Class.getClassLoader().getResource()解析
- 463. Island Perimeter 岛屿的周长
- Win10 64位 汇编环境的搭建: 安装配置 DOSBOX、MASM
- 免费的大数据学习资料,这一份就足够
- 拼多多九鼎:信息披露无瑕疵 “注水”的是竞争对手
- 《linux核心应用命令速查》连载十一:pstree:显示进程状态树
- 基于python的ROOT-MUSIC算法
- .net反混淆脱壳工具de4dot的使用
- Loadrunner脚本录制执行
- M1 M2 是什么意思?M1 M2的增速说明什么问题?
- mybatis-generator工具生成对应的自定Service和Controller
- 重磅!腾讯优图29篇论文入选顶会ECCV 2022
- linux使用certbot,如何自动续期~
- 安卓获取手机视频和图片
- 基于微信平台的电影购票系统设计与实现(程序+论文)