第62课 模型视图中的委托(下)

1. 委托的本质

(1)为视图提供数据编辑的上下文环境

(2)产生界面元素的工厂类

(3)能够使用和设置模型中的数据

2. 自定义委托类

(1)自定义委托类的继承关系

(2)自定义委托时需要重写的函数

  ①createEditor

  ②updateEditorGeometry

  ③setEditorData

  ④setModelData

  ⑤paint(可选)

(3)自定义委托时重写的函数由谁调用

由于模型视图设计模式,视图中组合了委托对象,既然委托存在于视图内部,就应该由视图来调用(可从上图的函数调用栈中看到这一点)

3. 重写函数的伪代码

(1)重写createEditor成员函数

//根据索引中值的类型创建编辑器组件
QWidget* createEditor(/*parameter*/) const
{
    QWidget* ret = NULL;

    if(index.data().type() == QVariant::Bool){
        /* create check box */
    }else if(){
        /* create combo box */
    }else {
        /*default*/
    }

    return ret;
}

(2)重写updateEditorGeometry成员函数

//根据参数中数据项的信息设置编辑器的位置和大小
void updateEditorGeometry(QWidget* editor,
                          const QStyleOptionViewItem& option,
                          const QModelIndex& index) const
{
    editor->setGeometry(option.rect);
}

(3)重写setEditorData成员函数

//根据参数中的数据索引设置编辑器中的初始数据
void setEditorData(QWidget* editor, const QModelIndex& index) const
{
    if( index.data().type() == QVariant::Bool ){
        QCheckBox* cb = dynamic_cast<QCheckBox*>(editor);
        /* set data to editor */
    }else if( index.data().type() == QVariant::Char){
        QCombobox* cb = dynamic_cast<QCombobox*>(editor);
        /* set data to editor */
    }else{
        QItemDelegate::setEditorData(editor, index);
    }
}

(4)重写setModelData成员函数

//根据参数中的数据索引更改模型中的数据
void setModelData(QWidget* editor,
                  QAbstractItemModel* model,
                  const QModelIndex& index) const
{
    if (index.data().type() == QVariant::Bool){
        QCheckBox* cb = dynamic_cast<QCheckBox*>(editor);
        /* set data to model from editor */
    }else if(index.data().type() == QVariant::Char){
        QCombobox* cb = dynamic_cast<QCombobox*>(editor);
        /* set data to model from editor */
    }else{
        /* default action from parent class */
    }
}

(5)重写paint成员函数(可选)

//根据参数中的信息绘制编辑器
void paint(QPainter* painter,
           const QStyledOptionViewItem& option,
           const QModelIndex& index) const
{
    if(/* condition */)
    {
        /* customized paint action */
    }else{
        QItemDelegate::paint(painter, option, index);
    }
}

【编程实验】自定义委托

//main.cpp

//Widget.h

//Widget.cpp

// CustomizedItemDelegate.h

// CustomizedItemDelegate.cpp

4. 小结

(1)自定义委托类时需要重写相应的成员函数

(2)根据需要创建编辑组件并设置组件中的数据

(3)编辑结束后将数据返回模型

(4)成员函数的参数携带了数据存取时需要的信息

时间: 2024-12-26 14:53:48

第62课 模型视图中的委托(下)的相关文章

第61课 模型视图中的委托(上)

1. Qt模型视图对用户输入的处理 (1)传统的MVC设计模式 (2)Qt中的模型视图设计模式如何处理用户输入? ①视图中集成了处理用户输入的功能(即委托) ②视图将用户输入作为内部独立的子功能来实现 ③模型负责组织数据,视图负责显示数据,委托则用于编辑修改数据. 2. 模型视图中的委托 (1)委托(Delegate)是视图中处理用户输入的部件(如编辑框.单选按钮等) (2)视图可以设置委托对象用于处理用户输入 (3)委托对象负责创建和显示用户输入的上下文(内容),如编辑框的创建和显示. (4)

第57课 模型视图设计模式(下)

1. Qt中标准模型定义 (1)预期的模型逻辑结构 (2)代码实现 //main.cpp #include "Widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } //Widget.h #ifndef WIDGET_H #define WIDGET_H #in

Qt模型/视图中的data和headerData

QAbstractItemModel QAbstractItemModel是一个抽象类,该抽象类未实现的纯虚方法有 QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex()) const [pure virtual] QModelIndex QAbstractItemModel::parent(const QModelIndex & index)

第55课 模型视图设计模式

1. 模型视图模式 (1)模型视图设计模式的核心思想 ①模型(数据)与视图(显示)相分离 ②模型对外提供标准接口存取数据(不关心数据如何显示) ③视图自定义数据的显示方式(不关心数据如何组织存储) (2)模型视图模式的直观理解 (3)模型视图模式的工作机制 ①当数据发生改变时,模型发出信号通知视图 ②当用户与视图进行交互时,视图发出信号提供交互信息 2. Qt中的模型-视图类层次结构 (1)Qt中的模型类的层次结构 (2)Qt中的视图类的层次结构 3. 关键技术问题 (1)模型如何为数据提供统一

QT 模型/视图 编程 委托篇

委托类 概述 与模型-视图-控制器模式不同,模型/视图设计不包括用于管理与用户交互的完全独立的组件.通常,视图负责向用户表示模型数据,并处理用户输入.为了在获取输入的方式上允许一定的灵活性,交互由委托执行.这些组件提供输入功能,并负责在某些视图中呈现各个项.控制委托的标准接口在QAbstractItemDelegate类中定义. 委托应该能够通过实现paint()和sizeHint()函数来呈现它们自己的内容.然而,简单的基于widget的委托可以子类化QItemDelegate而不是QAbst

QML中的模型/视图 十二

QML中对于数据的存储和显示使用模型/视图框架. 1. QML数据模型 视图项目(如ListView.GridView和Repeater等)需要使用数据模型来为其提供数据进行显示.这些项目通常也需要一个委托(delegate)组件来为模型中的每一个条目创建一个实例.模型可以是静态的,也可以进行动态的修改.插入.移除或者移动项目.Qt帮助参考QML Data Models关键字. Item{ width:200; height:250 ListModel{ id:myModel ListEleme

【GISER&amp;&amp;Painter】Chapter02:WebGL中的模型视图变换

上一节我们提到了如何在一张画布上画一个简单几何图形,通过创建画布,获取WebGLRendering上下文,创建一个简单的着色器,然后将一些顶点数据绑定到gl的Buffer中,最后通过绑定buffer数据,提供buffer中顶点数据的情况,执行渲染绘制方法,将数据结果从buffer中刷新到帧缓存中.整个流程十分清晰明了,可是通过对比原来OpenGL中的整个流程,我们会发现其中还缺少了一些很重要的处理步骤,虽然我们创建了属于自己的着色器,可并没有对顶点数据进行类似于顶点处理管线中的模型视图变换.透视

知识点3-5:在视图中显示视图模型数据

通常为了在视图中显示信息,可能会使用HtmlHelper(HTML辅助器)对象,以协助获取视图模型来生成HTML.考虑以下清单,它渲染完整的留言本条目. 在这个留言本条目详情屏幕中,我们显示了在模型中传递的留言本详细信息.接下来,用Razor的多行代码语句,以接受ViewData中的“hasPermission”值.Razor的多行代码语句是一个@{}代码块.最后,使用了一个Razor的if语句,有条件地显示编辑链接. 在登录页面中,我们使用了一个视图模型对象来表示整个表单,如清单3.6所示.

Qt 学习之路:模型-视图高级技术

PathView PathView是 QtQuick 中最强大的视图,同时也是最复杂的.PathView允许创建一种更灵活的视图.在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局.沿着同一布局路径,数据项的属性可以被更详细的设置,例如缩放.透明度等. 使用PathView首先需要定义一个代理和一个路径.除此之外,PathView还可以设置很多其它属性,其中最普遍的是pathItemCount,用于设置可视数据项的数目:preferredHighlightBegin.preferred