这是Model/View中的最后一篇了,Qt官方显然弱化了Controller在MVC中的作用,提供了一个简化版的Delegate;甚至在Model/View框架的使用中,提供了默认的委托,让这个控制器愈加淡出开发者的实现。

实际上,Qt Model/View框架中的MVC概念是有误的,显而易见的就是Controller的作用,控制器应该只对交互进行控制,渲染方面的工作应该仅由View完成,但Delegate的接口中却包含了这一块。不过这都不是这篇文章的重点,我们只关注Delegate本身。

1. 实现一个自定义Delegate

这里我们也来实现一个自定义Delegate,怀着了解Delegate的目的,主要实现以下几个功能:

  1. 以不同颜色绘制View。
  2. 双击View方格区域弹出行编辑器,默认覆盖这个区域,显示字母。
  3. 输入行编辑器内的内容会被保存,下次点开显示。
  4. 鼠标停留,显示提示框。

2. 继承QAbstractItemDelegate

Qt提供了几个标准的委托:

  1. QItemDelegate:Qt**曾经**默认使用的委托。
  2. QStyledItemDelegate。:**现在**默认使用的委托,官方推荐我们使用这个。(自从Qt 4.4)

为了熟悉委托借口,我们继承虚基类QAbstractItemDelegate来实现我们的自定义委托。

3. 实现虚函数

出去虚析构函数,QAbstractItemDelegate总共有9个虚函数,下面分别介绍。

paint()函数用来重绘view。我们这里选择用随机颜色填充背景:

void CustomeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{if (!index.isValid() || option.state == QStyle::State_None || !index.isValid())return;painter->fillRect(option.rect, QColor(m_randomColor(m_generator)));
}

createEditor()destroyEditor()的用途非常明显,双击View的时候会弹出一个行编辑器:

QWidget* CustomeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{return new QLineEdit(parent);
}void CustomeDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
{Q_ASSERT(dynamic_cast<QLineEdit*>(editor) != 0);delete dynamic_cast<QLineEdit*>(editor);
}

helpEvent()表示帮助事件,当发生QEvent::ToolTip或者QEvent::WhatsThis事件的时候,就会调用这个函数,我们这里根据事件不同显示不同内容的Tool Tip:

bool CustomeDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
{if (event->type() == QEvent::ToolTip) {QToolTip::showText(QCursor::pos(), QString("CustomeDelegate Tooltip"), reinterpret_cast<QWidget*>(view), option.rect, 1000);} else if (event->type() == QEvent::WhatsThis) {QToolTip::showText(QCursor::pos(), QString("CustomeDelegate Whatsthis"), reinterpret_cast<QWidget*>(view), option.rect, 1000);}return true;
}

当Editor显示的时候,会调用setEditorData()这个函数来显示默认的文字:

void CustomeDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{dynamic_cast<QLineEdit*>(editor)->setText(index.data(Qt::DisplayRole).toString());
}

setModelData()这个函数用来更新Model中的数据:

void CustomeDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{model->setData(index, dynamic_cast<QLineEdit*>(editor)->text(), Qt::DisplayRole);
}

updateEditorGeometry()这个函数也会在Editor显示的时候被调用,双击不同方格时,我们用它来更新编辑器的位置和大小:

void CustomeDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{dynamic_cast<QLineEdit*>(editor)->setFixedSize(option.rect.width(), option.rect.height());dynamic_cast<QLineEdit*>(editor)->move(option.rect.topLeft());
}

4. 运行结果

完整代码见此处。

转载于:https://www.cnblogs.com/lgxZJ/p/7617715.html

Qt--自定义Delegate相关推荐

  1. Qt 自定义信号与槽

    注 对象与槽理解 //第一个参数lineEdit是激发事件对象,信号中的方法必须在对象中存在,并在对象类头文件signals下定义,//第二个参数信号,//第三个参数this是槽方法所属类的对象,且必 ...

  2. QT自定义饼图的外观

    QT自定义饼图的外观 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 自定义饼图的外观. 项目技术 qt5.12,qt charts模块,C++ 项目展示

  3. QT自定义图表上不同元素的外观

    QT自定义图表上不同元素的外观 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 自定义图表上不同元素的外观. 项目技术 qt5.12,qt charts模块,C++ ...

  4. Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现

    文章目录 前言 效果 代码 .pro文件 widget.h widget.cpp widget.ui title.h title.cpp title.ui 前言 本次实验内容为Qt自定义标题栏,最小化 ...

  5. QT 自定义加载等待(Loading)提示框

    QT自定义加载等待提示框 一.效果展示 二.源代码 #ifndef LOADINGDIALOG_H #define LOADINGDIALOG_H #include <QMovie> #i ...

  6. QT自定义Widget控件及其使用

    今天来给大家分享一下QT自定义widget控件及其使用,当ui设计器提供的界面不满足实际需求时,可以从QWidget继承自定义的界面组件.有两种方法一种是提升法,另一种是ui设计器自定义界面组件wid ...

  7. QT 自定义分页控件

    Qt 自定义页码控件 一.效果展示 二.头文件 #ifndef PAGECONTROL_H #define PAGECONTROL_H #include <QList> #include ...

  8. QT自定义精美换肤界面

    QT自定义精美换肤界面 陆陆续续用QT开发过很多项目,也用QT写过不少私活项目,也写过N个工具,一直梦寐以求能像VC一样可以很方便的有个自定义的界面,QSS的强大让我看到了很好的希望,辗转百度谷歌无数 ...

  9. Qt自定义QPushButton

    目录 Qt自定义QPushButton 设置图标按钮 Qt自定义QPushButton 设置图标按钮 代码: m_pMinimizeButton = new QPushButton(this);m_p ...

  10. QT自定义进度条-画圆盘

    目录 QT自定义进度条-画圆盘 六等分圆盘 QT自定义进度条-画圆盘 六等分圆盘 void PaintWidget::paintEvent(QPaintEvent *e) {QPainter pain ...

最新文章

  1. Google Map API V3开发(5)
  2. 3、常用数据库访问接口简介
  3. ​NVIDIA针对数据不充分数据集进行生成改进,大幅提高CIFAR-10数据生成
  4. 【转】高性能WEB开发系列之重绘与回流
  5. Linu移植随笔:由ts_config:Success想到的
  6. JavaScript学习(八十三)—JavaScript书写位置、注释、以及输入输出语句
  7. 基础佛学知识-间歇博客
  8. 计算机四级要学多长时间,过计算机四级要多长时间哦?
  9. web案例-3D旋转魔方和太极
  10. php input type属性,input标签是什么?input标签属性有哪些
  11. vxe-table renderer 渲染器详解,render 渲染器使用方式
  12. servlet工作流程
  13. 计算机网络和internet选项,小编教你电脑ie的internet选项在哪
  14. Mstar的Monitor方案OSD 菜单制作(三)——添加字符串文字
  15. 二项分布 (Binomial Distribution)
  16. OpenCv图像处理之Mat类使用
  17. 海康摄像机被锁了 怎么办
  18. 怎么关闭windows中不在控制面板上的smartscreen筛选器
  19. VS2010 Ultimate 微软官网免费下载 VS2010终级版
  20. 【2022---计算机考研】数据结构之基础算法背诵版

热门文章

  1. 利用ggseqlogo绘制seqlogo图
  2. 剑指Offer的学习笔记(C#篇)-- 二叉树的下一个节点(好理解版本)
  3. mysql怎么让id重新开始自增
  4. CSS之clearfix清除浮动
  5. unix域套接字UDP网络编程
  6. 进程之间有8种通信方式
  7. 10%的IOS设备已经更新到版本5.1.1
  8. Koa2 和 Express 中间件对比
  9. php中$t=date()函数参数意义及时间更改
  10. 科研生活:避免碌碌无为的感觉