Qt 模式视图框架解读之委托
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 模式视图框架解读之委托相关推荐
- Qt 模型视图框架解读之模型
Qt 模型视图框架 前后阅读的好几遍,要不是项目中需要处理一些相对比较多的数据,这部分内容估计不会去急着去理解. 首先来了解下什么是模型和视图框架吧: 一般地:MVC 设计模式包括三个元素: 表示数据 ...
- Qt 图形视图框架中的事件处理和传播
目录名字 Qt 图形视图框架中的事件处理和传播 要点: Qt 图形视图框架中的事件处理和传播 图形视图框架在一些动画类的应用程序上经常会用到.该框架中的事件处理与传播机制也是经常会涉及. 程序设计核心 ...
- Qt图形视图框架详解-安晓辉-专题视频课程
Qt图形视图框架详解-12227人已学习 课程介绍 介绍Qt中的Graphics View Framework,涉及View.Scene.Item的关系,如何自定义QGraphicsI ...
- Qt 图形视图框架(Qt MVC)
什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离 ...
- Qt图形视图框架图片图元QGraphicsPixmapItem
文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/107.html 看这个标题还真有点拗口,一句话里出现了四个图字.这句话的关键词是图片,前面讲了 ...
- Qt图形视图框架:QGraphicsScene详解
一.描述 1.场景提供了一个用于管理大量2D图形项的平面.该类充当图形项的容器. 它与视图一起用于可视化2D曲面上的图形图形项. 2.场景没有自己的视觉外观,只负责管理图形项. 3.场景的最大优势之一 ...
- 201112阶段二qt图形视图框架
目录 一.学习的知识点 一)事件 二)图形视图框架 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 一)事件 鼠标事件的创建 组合键 二)图形视图框架 场景类:坐标系以中心为 ...
- Qt模型视图框架:QListView
一.描述 QListView 将存储在模型中的项目呈现为简单的非分层列表或图标集合.此视图不显示水平或垂直标题. QStandardItemModel * model = new QStandardI ...
- Qt图形视图框架:视图增加标尺
效果: 把视图.水平标尺.垂直标尺用网格布局放置. 每当拖动视图的滚动条时,更新标尺的偏移量: connect(deviceGraphicsView->horizontalScrollBar() ...
最新文章
- Android游戏框架之基础之AA碰撞系统
- OpenCV遍历图像性能比较、利用查找表
- python3生成器_Python3 生成器
- Linux命令应用大词典-第36章 密码和证书管理
- ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...
- 微信小程序秀才成语接龙趣味答题小游戏带流量主无授权源码
- angularjs -- 页面模板清除
- 【2021最新版】Java基础面试题总结(70道题含答案解析)
- java guice_java – Guice Inject类中的字段不是由Guice创建的
- CNN结构:色温-冷暖色的定义和领域区分(一)
- 基于余弦适应性骨架的差分进化算法
- llvm如何使用vc编译器_使用LLVM框架创建有效的编译器,第2部分
- 用大白菜装centos7_大白菜安装centos7 踩坑记
- atcod D - Staircase Sequences
- android TextView 中划线、下划线 跑马灯
- 明日之后最好看的房子又来啦:情侣专属泰坦尼克号造型登场
- Linux自我学习笔记03
- 怎么注册微信公众平台
- 版式设计编排形式与规律,丰富多彩!
- 智能门锁物联卡开启智能家庭新模式,引领智能家居新征程
热门文章
- 超详细的8psk调制解调通信系统讲解与仿真
- Mouse Without Borders 一套鼠标键盘控制多台电脑
- 云炬随笔20171103
- 同学录APP开题报告 2017-12-14
- [我的1024开源程序]350元写的HTML5程序
- 福利派送!6 月份赠书活动开始啦!
- Cannot find reference ‘PDFDocument‘ in ‘pdfparser.py‘
- 派生类中构造函数与虚构函数的研究
- 设计模式之facade模式
- Updatepanel与Jquery合用时的问题解决