Qt 笔记:模型视图中的委托

模型视图中的委托

-委托(Delegate)是视图中处理用户输入的部件

-视图可以设置委托对象用于处理用户输入

-委托对象负责创建和显示用户输入上下文

 委托中的编辑器

-委托能够提供编辑时需要的上下文环境(编辑器)

-不同委托提供的编辑器类型不同(文本框,单选框,等)

-编辑器用从模型获取数据,并将编辑结果返回模型

 委托中的关键函数

-createEditor

·需要编辑数据时,创建编辑器组件

-updataeEditorGeometry

·更新编辑器组件的大小

-setEditorData

·通过索引从模型中获取数据

-setModelData

·将编辑后的新数据返回

委托中的关键信号

-void closeEditor(QWidget *editor)

·编辑器组件关闭信号

void commitData(QWidget *editor)

·新数据提交信号

委托的本质

-为视图提供数据编辑的上下文环境

-产生界面元素的工厂类

-能够使用和设置模型中的数据

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

-createEditor

-updateEditorGeometry

-setEditorData

-setModeIData

-paint(可选)

重写creatorEditor成员函数

-根据索引中值的类型创建编辑器组件

QWdidget *creatorEditor( /* parameter */ )const
{
    QWidget *ret = NULL;

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

重写updateEditorGeometry成员函数

-根据参数中数据项的信息设置编辑器的位置和大小

void updateEditorGeometry(QWidget *editor, 
        const QStyaleOptionViewItem &option,const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

重写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);
    }
    else
    {
        QItemDelegate::setEditorData(editor,index);
    }
}                        

重写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
    {
        /* dafault action from parent class */
    }
}

重写paint成员函数(可选)

-根据参数中的信息绘制编辑器

void paint(QPainter *painter,
            const QStyleOptionViewItem &option,
            const QModelIndex &index) const
{
    if( /* condition */ )
    {
        /* customized paint action */
    }
    else
    {
        QItemDelegate::paint(Painterr,option,index);
    }
    
}

总结:

-自定委托类时需要重写相应的成员函数

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

-编辑结束后将数据返回模型

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

自定义委托类

猜你喜欢

转载自blog.csdn.net/qq_29962483/article/details/82835079