首页 > 代码库 > 第62课 模型视图中的委托(下)

第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)成员函数的参数携带了数据存取时需要的信息

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