3、委托类

Qt中的模型、视图结构中没有包含一个完全分离的组件来处理与用户的交互。

一般地、视图用来将模型中的数据展示给用户,也用来处理用户的输入。为了获得更高的灵活性,交互可以交给委托来执行。

控制委托的标准接口在QAbstractItemDelegate类中定义。

委托通过实现paint()和sizeHint()来使它们可以渲染自身的内容。

基于部件的委托可以通过子类化QItemDelegate来实现。

委托的编辑器可以通过两种方式来实现,

一、使用部件来管理编辑过程。

二、直接处理事件。

可以参考Qt提供的Spin Box Delegate的示例程序,如下:

委托:顾明思议,使用标准Qt 的编辑器编辑(standard QT editor widget),然后再将数据返回到视图中。

先看下SpinBoxDelegate Class Definition:

class SpinBoxDelegate : public QStyledItemDelegate{Q_OBJECTpublic:SpinBoxDelegate(QObject *parent = nullptr);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;};

上述类的定义中做了如下几项事情:
1、创建 一个编辑部件,并在视图中的确定位置显示。
2、与数据模型通信。

另外,自定义模型可以通过paintEvent来提供自定义的painting code
当然,还可以通过重载destroyEditor()函数来实现可编辑部件的重复使用。

SpinBoxDelegate 类成员的实现:
委托常常代码量是非常少的。构造韩式也仅仅需要调用类默认的构造函数即可。
1、构造函数:

 SpinBoxDelegate::SpinBoxDelegate(QObject *parent): QStyledItemDelegate(parent){}

2、createEditor():该函数返回一个可编辑部件,并且将从数据模型中获得的数据的值限定在0到100之间。

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

3、setEditorData(): 从模型中读到数据,并将它转化为整形,然后写到这个可编辑的部件中。

  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);}

4、setModelData(): 从spin box 中读到数据,并将数据写入到数据模型中。

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);}

这里的interpretText()函数,是为了让我们获得到的是spin box 中最新的的数据。

5、updateEditorGeometry():更新可编辑部件的几何形状,这是委托机制中必不可少的。

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

主函数的实现

主函数实现以下几方面内容:
1、通过标准数据模型来创建数据项;
2、建立表格视图来显示这些数据项;
3、创建一个委托来编辑数据;

int main(int argc, char *argv[]){QApplication app(argc, argv);QStandardItemModel model(4, 2);QTableView tableView;tableView.setModel(&model);SpinBoxDelegate delegate;tableView.setItemDelegate(&delegate);for (int row = 0; row < 4; ++row) {for (int column = 0; column < 2; ++column) {QModelIndex index = model.index(row, column, QModelIndex());model.setData(index, QVariant((row + 1) * (column + 1)));}}tableView.setWindowTitle(QObject::tr("Spin Box Delegate"));tableView.show();return app.exec();}

由于委托继承自QStyledItemDelegate,每一个单元格会通过标准绘图操作绘制。(这句话的理解就是,当单元格被操作的时候,会建立委托,而这个委托的视图是通过标准的绘图操作来实现)

到这里,这个spin box delegate的介绍就结束了。想必多操作,多练习自然就明白了。

Qt 模式视图框架解读之委托相关推荐

  1. Qt 模型视图框架解读之模型

    Qt 模型视图框架 前后阅读的好几遍,要不是项目中需要处理一些相对比较多的数据,这部分内容估计不会去急着去理解. 首先来了解下什么是模型和视图框架吧: 一般地:MVC 设计模式包括三个元素: 表示数据 ...

  2. Qt 图形视图框架中的事件处理和传播

    目录名字 Qt 图形视图框架中的事件处理和传播 要点: Qt 图形视图框架中的事件处理和传播 图形视图框架在一些动画类的应用程序上经常会用到.该框架中的事件处理与传播机制也是经常会涉及. 程序设计核心 ...

  3. Qt图形视图框架详解-安晓辉-专题视频课程

    Qt图形视图框架详解-12227人已学习 课程介绍         介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...

  4. Qt 图形视图框架(Qt MVC)

    什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离 ...

  5. Qt图形视图框架图片图元QGraphicsPixmapItem

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/107.html 看这个标题还真有点拗口,一句话里出现了四个图字.这句话的关键词是图片,前面讲了 ...

  6. Qt图形视图框架:QGraphicsScene详解

    一.描述 1.场景提供了一个用于管理大量2D图形项的平面.该类充当图形项的容器. 它与视图一起用于可视化2D曲面上的图形图形项. 2.场景没有自己的视觉外观,只负责管理图形项. 3.场景的最大优势之一 ...

  7. 201112阶段二qt图形视图框架

    目录 一.学习的知识点 一)事件 二)图形视图框架 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 一)事件 鼠标事件的创建 组合键 二)图形视图框架 场景类:坐标系以中心为 ...

  8. Qt模型视图框架:QListView

    一.描述 QListView 将存储在模型中的项目呈现为简单的非分层列表或图标集合.此视图不显示水平或垂直标题. QStandardItemModel * model = new QStandardI ...

  9. Qt图形视图框架:视图增加标尺

    效果: 把视图.水平标尺.垂直标尺用网格布局放置. 每当拖动视图的滚动条时,更新标尺的偏移量: connect(deviceGraphicsView->horizontalScrollBar() ...

最新文章

  1. Android游戏框架之基础之AA碰撞系统
  2. OpenCV遍历图像性能比较、利用查找表
  3. python3生成器_Python3 生成器
  4. Linux命令应用大词典-第36章 密码和证书管理
  5. ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...
  6. 微信小程序秀才成语接龙趣味答题小游戏带流量主无授权源码
  7. angularjs -- 页面模板清除
  8. 【2021最新版】Java基础面试题总结(70道题含答案解析)
  9. java guice_java – Guice Inject类中的字段不是由Guice创建的
  10. CNN结构:色温-冷暖色的定义和领域区分(一)
  11. 基于余弦适应性骨架的差分进化算法
  12. llvm如何使用vc编译器_使用LLVM框架创建有效的编译器,第2部分
  13. 用大白菜装centos7_大白菜安装centos7 踩坑记
  14. atcod D - Staircase Sequences
  15. android TextView 中划线、下划线 跑马灯
  16. 明日之后最好看的房子又来啦:情侣专属泰坦尼克号造型登场
  17. Linux自我学习笔记03
  18. 怎么注册微信公众平台
  19. 版式设计编排形式与规律,丰富多彩!
  20. 智能门锁物联卡开启智能家庭新模式,引领智能家居新征程

热门文章

  1. 超详细的8psk调制解调通信系统讲解与仿真
  2. Mouse Without Borders 一套鼠标键盘控制多台电脑
  3. 云炬随笔20171103
  4. 同学录APP开题报告 2017-12-14
  5. [我的1024开源程序]350元写的HTML5程序
  6. 福利派送!6 月份赠书活动开始啦!
  7. Cannot find reference ‘PDFDocument‘ in ‘pdfparser.py‘
  8. 派生类中构造函数与虚构函数的研究
  9. 设计模式之facade模式
  10. Updatepanel与Jquery合用时的问题解决