zoukankan      html  css  js  c++  java
  • 26.QT-模型视图之自定义委托

          在上一章学习 25.QT-模型视图 后,本章接着学习视图委托


    <span "="" src="https://images2018.cnblogs.com/blog/1182576/201806/1182576-20180615112117897-1789509195.png">

    初探自定义委托类 

    • 委托属于视图的子功能
    • 视图主要负责组织具体数据项的显示方式(是列表方式,还是树形方式,还是表格方式)
    • 委托主要负责具体数据项的显示和编辑,比如用户需要编辑某个数据时,则需要弹出编辑框
    • 视图可以通过 itemDelegate() ,setItemDelegate ( )成员函数来 获得/设置当前委托对象
    • QAbstractItemDelegate类是所有委托的父类,用来 负责提供通用接口
    • 在模型视图中,会默认提供一个QStyledItemDelegate类,供用户编辑数据
    • 也可以通过继承QItemDelegate父类,实现自定义委托功能

    QAbstractItemDelegate类中的关键虚函数

    QAbstractItemDelegate类中的关键信号

    我们以编辑某个数据项为例:

    • 视图首先会调用createEditor()函数生成编辑器
    • 调用updateEditorGeometry()函数设置编辑器组件大小
    • 调用setEditorData()函数,将模型里的数据提取到编辑器中
    • 等待用户编辑... ...
    • 当用户编辑完成后, 系统将会发送commitData信号函数
    • 然后调用setModelData()函数,设置模型数据,以及setEditorData()函数,更新编辑器
    • 视图最后发送closeEditor()信号函数,表示已关闭编辑器

    接下来,我们重写上面函数,来自定义一个QCostomizedDelegate委托类

    效果如下

     

    QCustomizedDelegate.h:

    QCustomizedDelegate.cpp:

    然后,再通过视图的setItemDelegate(QAbstractItemDelegate * delegate )成员函数设置我们自定义的委托类对象即可

    深入自定义委托类

    之前我们写的自定义委托,每次都需要双击某个数据项,才能弹出编辑器

    那如何让委托一直呈现在视图显示上呢?

    步骤如下:

    • 重写委托类的paint成员函数
    • 在paint()中,通过QApplication::style()->drawControl()来自定义数据显示方式,比如绘制按钮
    • 重写委托类的editorEvent成员函数
    • 在editorEvent中处理交互事件,比如判断鼠标是否双击,以及更改模型数据等

    其中QApplication::style()->drawControl()函数参数如下所示:

    示例-自定义一个QCostomizedDelegate委托类

    效果如下

     

    代码如下

    QCustomizedDelegate.h:

    QCustomizedDelegate.cpp:


    文章来源:https://www.cnblogs.com/lifexy/p/9186565.html

  • 相关阅读:
    Babel 7.x 和 Babel 8.x的区别
    JavaScript——Set 的用法
    DFS 和 BFS
    JavaScript——event事件详解
    Day17-18前端学习之路——Javascript事件
    Day17-18前端学习之路——常用语句资料库
    Day5前端学习之路——盒模型和浮动
    Day7前端学习之路——多栏布局
    如何在GitHub预览html
    新人上路请教一个输入字符的问题
  • 原文地址:https://www.cnblogs.com/xiongjim/p/9674163.html
Copyright © 2011-2022 走看看