ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

我的QT Creator学习笔记(三十二)——模型/视图编程之委托类

2021-04-03 12:58:21  阅读:173  来源: 互联网

标签:index const QT Creator 视图 editor QWidget SpinBoxDelegate


一、 委托类

模型/视图结构中,一般的,视图用来将模型中的数据展示给用户,也用来处理用户的输入。为了获得更高的灵活性,交互可以由委托来执行。这些组件提供了输入功能,而且也负责渲染一些视图中的个别项目。控制委托的标准接口在QAbstractItemDelegate类中定义。

委托通过实现paint()和sizeHint()函数来使它们可以渲染自身的内容。简单的基于部件的委托可以通过子类化QItemDelegate来实现,这样可以使用这些函数的默认实现。可以使用itemDelegate()函数获取一个视图中使用的委托,使用setItemDelegate()函数为视图安装一个自定义委托。

二、自定义委托类

下面例子来说明如何使用现成的部件自定义委托。例子中使用QSpinBox来提供编辑功能,主要用于显示数据的模型。

在上一篇我的QT Creator学习笔记(三十一)——模型/视图编程之视图类工程的基础上,向项目中添加新的C++类,类名为SpinBoxDelegate,基类设置为QItemDelegate,将spinboxdelegate.h修改如下

#ifndef SPINBOXDELEGATE_H
#define SPINBOXDELEGATE_H
#include <QItemDelegate>

class SpinBoxDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    explicit SpinBoxDelegate(QObject *parent = 0);
    QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
    void setEditorData(QWidget *editor, const QModelIndex &index) const override;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};

#endif // SPINBOXDELEGATE_H

这里面要重写父类的几个函数来管理编辑器部件。

在spinboxdelegate.cpp中依次添加几个函数的实现

构造函数

SpinBoxDelegate::SpinBoxDelegate(QObject *parent):QItemDelegate(parent)
{

}

创建编辑器函数

//创建编辑器
QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSpinBox* editor=new QSpinBox(parent);
    editor->setMinimum(0);
    editor->setMaximum(100);
    return editor;
}

为编辑器设置数据函数,在该函数中要在访问编辑器的成员函数之前,将它转化为合适的类型。

//为编辑器设置数据
void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    int value=index.model()->data(index,Qt::EditRole).toInt();
    QSpinBox* spinBox=static_cast<QSpinBox*>(editor);
    spinBox->setValue(value);
}

将数据写入模型。当用户完成了对QSpinBox部件中数据的编辑时,视图会通过调用setModelData()函数来告知委托将编辑好的数据存储到模型中。

//将数据写入到模型
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QSpinBox* spinBox=static_cast<QSpinBox*>(editor);
    spinBox->interpretText();
    int value=spinBox->value();
    model->setData(index,value,Qt::EditRole);
}

更新编辑器几何布局。委托有责任来管理编辑器的几何布局,必须在创建编辑器以及视图中项目大小或位置改变时,来设置它的几何布局,视图使用了一个QStyleOptionViewItem对象来提供来所有需要的几何布局信息。

//更新编辑器几何布局
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

最后,在mainwindow中使用自定义的委托类,在 mainwindow.cpp中包含spinboxdelegate.h文件,在构造函数中为tableView设置自定义委托

    SpinBoxDelegate* delegate=new SpinBoxDelegate(this);
    tableView->setItemDelegate(delegate);

运行效果如下

 

 

标签:index,const,QT,Creator,视图,editor,QWidget,SpinBoxDelegate
来源: https://blog.csdn.net/sinat_41928334/article/details/115285072

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有