Qt-QTreeView自定义树控件

在做中大型项目时,可能又成百上千个功能界面,而这些功能界面无非就是数据的输入与输出,那么对常用的控件进行定制是非常重要的。本人认为Qt的原生控件使用起来有以下几点问题:
1、 Qt控件为了兼容各种情况,设计得是比较抽象的,对于新员工来说理解起来比较困难,接口调用也复杂;
2、 不同的人对代码理解不同,Qt的控件用起来也是各显神通,后期维护起来非常困难;
3、 每个公司的产品有自己的外观风格,定制控件可以同一实现外观,无需开发人员自己处理。
可能刚刚看感觉比想象中的复杂一点,但是只要多看几遍就会清楚为什么Qt的控件要这样设计,项绘制部分参考了网上的代码。
主要自定义两个类,CustomTree和CustomTreeItemDelegate,类关系如下图:
在这里插入图片描述
核心代码:

void CustomTreeDelegate :: paint ( QPainter * painter , const QStyleOptionViewItem & option , const QModelIndex & index ) const painter - > setRenderHint ( QPainter :: Antialiasing ) ; //绘制背景 QColor colorBg ; if ( option . state & QStyle :: State_Selected ) colorBg = m_view - > checkedBgColor ( ) ; else if ( option . state & QStyle :: State_MouseOver ) colorBg = m_view - > hoverBgColor ( ) ; colorBg = m_view - > bgColor ( ) ; QRect bgRect ( 0 , option . rect . top ( ) , m_view - > width ( ) , option . rect . height ( ) ) ; // 直接用option.rect,二级树左边有空白 painter - > fillRect ( bgRect , colorBg ) ; // 绘制checked状态的item的右侧三角形 if ( option . state & QStyle :: State_Selected ) painter - > setPen ( Qt :: NoPen ) ; painter - > setBrush ( m_view - > checkedTextColor ( ) ) ; QVector < QPointF > points ; points . append ( QPointF ( option . rect . right ( ) , option . rect . top ( ) + option . rect . height ( ) * 0.3 ) ) ; points . append ( QPointF ( option . rect . right ( ) , option . rect . top ( ) + option . rect . height ( ) * 0.7 ) ) ; points . append ( QPointF ( option . rect . right ( ) - option . rect . height ( ) * 0.3 Qt-QTreeView自定义树控件在做中大型项目时,可能又成百上千个功能界面,而这些功能界面无非就是数据的输入与输出,那么对常用的控件进行定制是非常重要的。本人认为Qt的原生控件使用起来有以下几点问题:1、 Qt控件为了兼容各种情况,设计得是比较抽象的,对于新员工来说理解起来比较困难,接口调用也复杂;2、 不同的人对代码理解不同,Qt的控件用起来也是各显神通,后期维护起来非常困难;3、 ...
要想成为高级程序员,必须精通C++。大量第三方开源库使用C++编写。开发移动应用的一些核心功能必须使用C C++。Qt是大公司大量使用的跨平台c++库,号称工具软件之王。Qt作为一个如此高效,跨平台的GUI开发框架,如何快速掌握其精髓?写出高质量,复杂的交互?这是困扰很多中高级开发人员,很头疼的一个问题。在这个课程中,我们会给出非常好的答案。 为什么很多同学学了很多年编程,看了很多书,教程,还是不会写,只能在网络上copy代码?或者自己没有动手能力,遇到稍微复杂的东西就束手无策?为什么那些高效率学习的人,能在三五天内掌握Qt,并开始写软件,做项目?一个类似Qt这样的开发框架,几千个API,如何学习?为什么我们同学学习了一两年Qt C++还糊里糊涂,有的人只需要几天时间就掌握Qt的精髓?通过这个系列课程的学习,让学员深入理解一套GUI开发框架,编程思想。并将这套思想应用到任何平台的开发中,例如iOS,Android。 理解这套编程思想,日后可以运用于快速学习任何一套新的东西,框架。 通过这一系列课程的训练,希望大家能达到无招胜有招的境界。达到以后遇到任何客户端软件,拍着胸脯说,我
环境:Win10 + Visual Studio 2019 + Qt 5.14.0 最近做Qt开发,为了要实现QWidget的鼠标点击事件,写了继承自QWidget的自 定义 类MyWidget,然后在Qt Designer界面将QWidget提升为MyWidget。但是运行时候出现了问题: 就是我提升为MyWidget的那个QWidget 件的提升之前设置的QWidget的灰色边框消失了(但是鼠标点击事件正常),没有提升为MyWidget的QWidget 件没事。然后采取了以下措...
1.1要更改QTreeView的展开节点箭头小图标,用QSS主要用如下语句:"QTreeView::branch:open:has-children:!has-siblings," "QTreeView::branch:open:has-children:has-siblings {image: url(:res/recoverydata/icon/icon_list_2.png);}" "QTr...
QtreeView是ui中最常用的 件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有mvc的特点)。 1. QStandardItemModel在QTreeView中的使用 使用QTreeView的对应模型是QStandardItemModel,这个是Qt对应ui界面最有用
Tree view与Tree Widget 相比而言,需要为tree view 设置一个model。使用tree view 能有效降低内存的使用率。但是需要自 定义 model。下面参考Qt官方提供的demo,讨论如何自 定义 Tree View Model。 依据名为simple tree model官方demo可知道:要自 定义 tree view model需要 定义 一个 形结构的底层数据结构,该类型结...
Qt是一种流行的跨平台C++应用程序框架,在GUI开发方面非常出色。Qt包含大量的 件,其中一个是 件QTreeView。这个 件允许用户显示带有 形视图的数据模型,它是QAbstractItemView的派生类之一。 QTreeView 件具有以下特点: 1. 显示数据模型 - QTreeView 件显示 件绑定的数据模型。用户可以打开和关闭节点以显示或隐藏子节点。 2. 的构建 - 的层次结构是通过节点之间的父子关系来 定义 的。最上面的节点称为根节点,其余的为子节点。 3. 定制化 - QTreeView 件可以被用户定制。用户可以通过设置 件的颜色、字体、大小和对齐方式等来将 件表现为自己想要的样子。 4. 功能强大 - QTreeView 件有很多内置的功能,包括可排序、可过滤、可编辑等等。它也允许用户通过自 定义 delegate,来实现额外的交互行为。 下面是一些使用QTreeView 件的示例: 1. 创建一个QTreeView 件: QTreeView *treeView = new QTreeView(parent); 2. 设置它的数据模型: QStandardItemModel *model = new QStandardItemModel(parent); treeView->setModel(model); 3. 填充数据模型: QStandardItem *rootItem = model->invisibleRootItem(); QStandardItem *item1 = new QStandardItem("Item 1"); QStandardItem *item2 = new QStandardItem("Item 2"); rootItem->appendRow(item1); rootItem->appendRow(item2); 4. 显示 件: treeView->show(); QTreeView 件是一个非常强大的 件,可以用于各种情况下。它可以轻松地显示大量的数据,并让用户轻松地翻阅它们。在GUI开发中,QTreeView 件是一个非常有用的 件。