Qt Model_View教程之Delegate

qt Model_View_Delegate 模型_视图_代理 用于将数据存储在特定格式中并提供访问和操作这些数据的方法。它们实现了Qt Model/View体系结构的核心,允许在用户界面中呈现数据。Qt提供了多种类型的model,包括列表、表格、树形结构等。通过使用标准接口来访问model,可以轻松地进行数据排序、过滤、插入、修改和删除操作。Model通常与view(视图)搭配使用,以便在GUI中显示数据。常用的model有QStandardItemModel、Q、QSqlQueryModel、QFileSystemModel等。 阅读详情

在之前的文章里主要介绍了Qt Model/View 的一些基本用法,接下来结合Delegate做最后的说明。

 

在之前的所有例子中,cell中填充的要么是text文本或是checkbox,那么如果我们想要填充自己定义的一些东西时该怎么做呢?这就涉及到了Delegate。在之前的view中我们一直使用的是默认的Delegate,现在我们想要填充自己定义的内容,比如说在cell中填充五角星,这就需要我们重新实现Delegate。效果如下:

在View中使用setItemDelegate()方法代替使用默认的Delegate并使用自定义的Delegate。新的Delegate可以通过继承QStyledItemDelegate来重新实现。为了简化功能,填充的五角星并没有可编辑的能力,而我们只需要重新实现QStyledItemDelegate类中的paint和sizeHint方法即可。

 

一、 StarDelegate 类

 

头文件如下:

class StarDelegate : public QStyledItemDelegate
{
    Q_OBJECT


public:
    StarDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent) {}


    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const Q_DECL_OVERRIDE;
    QSize sizeHint(const QStyleOptionViewItem &option,
                   const QModelIndex &index) const Q_DECL_OVERRIDE;


};

paint通过原始数据的内容来绘制五角星,数据的获取与之前的Model类似,使用index.data();sizeHint()用来获取每个五角星的维度,cell则可以有足够的空间来适应五角星的大小。

 

源文件如下:

void StarDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                         const QModelIndex &index) const
{


    if (index.data().canConvert<StarRating>())
    {
        StarRating starRating = qvariant_cast<StarRating>(index.data());


        starRating.paint(painter, option.rect, option.palette);
    }
    else
    {
        QStyledItemDelegate::paint(painter, option, index);
    }


}




QSize StarDelegate::sizeHint(const QStyleOptionViewItem &option,
                             const QModelIndex &index) const
{
    if (index.data().canConvert<StarRating>())
    {
        StarRating starRating = qvariant_cast<StarRating>(index.data());
        return starRating.sizeHint();
    }
    else
    {
        return QStyledItemDelegate::sizeHint(option, index);
    }
}

只有当index.data()是StarRating时我们才使用自己定义的五角星,否则使用QStyledItemDelegate来进行绘制。

 

 

 

如果想要使用自定义图形来填充View 栅格中的cell,这时我们可以使用自定义Delegate,但如果不想使用View中的栅格,则需自定义View。

 

二、 StarRating类

这个主要是画五角星,五角星点位的计算有数学公式,可自行百度。

 

头文件:

class StarRating
{
public:


    explicit StarRating(int starCount = 1, int maxStarCount = 5);


    void paint(QPainter *painter, const QRect &rect,
               const QPalette &palette) const;
    QSize sizeHint() const;
    int starCount() const { return myStarCount; }
    int maxStarCount() const { return myMaxStarCount; }
    void setStarCount(int starCount) { myStarCount = starCount; }
    void setMaxStarCount(int maxStarCount) { myMaxStarCount = maxStarCount; }


private:
    QPolygonF starPolygon;


    int myStarCount;
    int myMaxStarCount;
};

源文件:

StarRating::StarRating(int starCount, int maxStarCount)
{
    myStarCount = starCount;
    myMaxStarCount = maxStarCount;


    starPolygon << QPointF(1.0, 0.5);
    for (int i = 1; i < 5; ++i)
        starPolygon << QPointF(0.5 + 0.5 * std::cos(0.8 * i * 3.14),
                               0.5 + 0.5 * std::sin(0.8 * i * 3.14));  //使用公式
}






QSize StarRating::sizeHint() const
{
    return PaintingScaleFactor * QSize(myMaxStarCount, 1);
}


void StarRating::paint(QPainter *painter, const QRect &rect,
                       const QPalette &palette) const
{
    painter->save();


    painter->setRenderHint(QPainter::Antialiasing, true);
    painter->setPen(Qt::NoPen);


    painter->setBrush(palette.foreground());




    int yOffset = (rect.height() - PaintingScaleFactor) / 2;
    painter->translate(rect.x(), rect.y() + yOffset);
    painter->scale(PaintingScaleFactor, PaintingScaleFactor);


    for (int i = 0; i < myMaxStarCount; ++i)
    {
        if (i < myStarCount)
        {
            painter->drawPolygon(starPolygon, Qt::WindingFill);
        }


        painter->translate(1.0, 0.0);
    }


    painter->restore();


}

三、 总结

之后会把所有关于的Qt  Model/View的内容重新梳理下。

欢迎关注公众号:

Qt Model/View 学习(6) - Delegate教程之——渲染 Delegate:该来的总是要来的…… 阅读详情

相关推荐

Qt Model/View 学习(1) - 是什么和为什么?

Qt Model/View入门第一篇:先知道Model/View是个啥~有啥用~

Copperxcx的博客 6147

qt model view Delegate的例子

改例子是工作中从同事那里得到的参考例子,感觉经典,就留下来了,虽然内容不多,几乎涵盖了所有相关的操作,很好的参考例子,所以要留下来,方便以后使用

Qt Model/View/Delegate 架构深度解析

摘要:Qt模型/视图/委托架构通过分离数据与表现实现高效GUI开发。核心组件包括:Model负责数据管理,View负责可视化展示,Delegate控制渲染和编辑方式。该架构支持一份数据多种展示,具有高性能和高度可定制的特点。文中以学生成绩管理系统为例,演示了如何自定义模型(StudentModel)存储学生数据,使用委托(ScoreDelegate)实现分数列的特定编辑逻辑,并通过QTableView和QListView同时展示同一份数据,实现数据修改的实时同步。这种设计模式显著提升了Qt应用的灵活性、扩展

2401_82978699的博客 1232

Qt Model/View( 一)

Qt Model/View 学习笔记    2009-02-17 09:20:28|  分类:IT笔记 |  标签:|字号大中小 订阅 http://doc.trolltech.com/main-snapshot/model-view-programming.html 介绍 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系。这种

低调..... 3145

PyQt Model/View编程:通过实例代码来认识 Delegate 组件的强大功能

Delegate是PyQt Model/View 模型-视图框架的3个组件之一,也称为委托,或代理, Delegate主要用于渲染单元格外观; 为修改时提供编辑控件功能。QAbstractItemDelegate是基类, 子类有ItemDelegate, QStyledItemDelegate, QSqlRelationalDelegate类,本文给出了自定义下拉列表Combo Delegate、进度条 progressBar Delegate, 星号图形 Delegate类的实例代码

Python技术探索 2383

用QT的model/view/delegate接口实现自定义的窗口渲染

欢迎提出意见,因为本就是为交流而分享。 qt的model接口(qabstractItemModel)管理的数据抽象来说是节点树,最顶层的根节点可以有N行M列个子item,而每个item又可以有自己的N行M列个子item。 qt的view接口(qabstractItemView)的实现是从model获取数据,但要怎样在窗口中渲染这些数据,每个view的实例都可以有自己的实现,甚至

upnow2014的专栏 2612

Qt Model&View&Delegate(模型-视图-代理) 介绍和使用

Model(模型)介绍、View(视图)介绍 Delegate(代理) 介绍 Model-View-Delegate(模型视图-代理)实操

wei_Embedded_z的博客 2017

【QT】Model/View结构

本文介绍Model/View(模型/视图)结构,主要涉及Model/View基本原理、数据模型、视图组件、代理等相关概念

u011671745的博客 1962

Qt扫盲-Qt Model/View 理论总结 [上篇]

Qt 包含了一组 item view类,它们使用 model / view 架构来管理数据之间的关系以及呈现给用户的方式。该体系结构引入的功能开发人员提供了更大的灵活性来自定义表现形式,而且这个框架还提供了一个标准的model 接口,以允许广泛的数据源与现有 item 目 View 一起使用。在本文中,我们简要介绍了 model / view 编程概念,概述了所涉及的概念,并描述了 item 目View系统的体系结构。对架构中的每个组件都进行了解释,并给出了如何使用所提供的类的示例。

洪源兄 2627

Qt之Model/View架构

Qt中的Model/View架构摘要 Model/View是Qt中用于分离数据和视图展示的设计模式,源于MVC架构的简化。该架构由三个核心组件组成: Model - 管理数据,提供标准接口 View - 显示数据 Delegate - 处理数据项的渲染和编辑 主要特点: 支持多种视图展示同一数据源 适合处理大量结构化数据 内置排序、过滤和编辑功能 通过委托可自定义显示和编辑方式 适用场景: 需要多种方式展示相同数据时 处理大数据量或动态数据时 需要复杂的数据展示和编辑功能时

Mei20140912的专栏 880

Qt5中的model-view-delegate

Qt5中的model-view-delegate也就是模型-视图-代理结构,与MVC设计模式相似,完成了数据和界面的分离。Qt的模型-视图结构分为三部分:模型(model)、视图(View)、和代理(Delegate)。其中模型与数据源通信,并为其他部件提供接口,而视图从模型中活得用来引用数据条目的模型索引(Model Index)。在视图中,代理负责绘制数据条目,当编辑条目的时候,代理和模型直接进行通信,他们之间的关系如下图所示: 他们之间的关系如下: 1.当数据发生改变的时候,模型发出信号通

yang1fei2的博客 2087

QT MVC 编程 MODEL/DELEGATE/VIEW(一)

MVC架构通过数据、视图分离能够带来性能的显著提升以及高度的灵活性,Qt提供了一种略微不同于MVC(Model-View-Controller)的架构,称之为MVD(Model-View-Delgate)架构。即Controller实际上应由用户自己组合实现,Qt未提供专门的类来处理,Qt提供了一系列的Delegate协调Model和View,实现渲染、数据编辑和转换,不直接参与界面布局,而是与View配合进行细节控制以及将Model数据转换为View可用的格式。

cnbizz的专栏 874

QT中Model-View-Delegate委托代理机制用法介绍

之前的一篇文章中介绍过QT的委托代理机制,那时候由于理解的比较浅就简单的给了一个例子。最近又做了一部分相关的工作,发现之前的理解有点问题。这里就详细的介绍一下QT的委托代理机制的用法,希望对大家有帮助。 Model-View-Delegate机制可以简单的理解为将本地的一些数据以特定的UI形式呈现出来。常见的数据结构包括列表数据(list)、表格数据(table)、树状数据(tree),分别对应着QT中的QListView、QTableView、QTreeView控件。...

yang1fei2的博客 5192

Qt的Model/View Framework解析

      最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章。E文的除了Qt的官方介绍,其它文章也很少。看到一个老外在blog中写道Model/View是他认为Qt中最不好的一部分了。真的是这样吗?为了回馈开源社区,我写了这篇blog,写的是我认为比较有价值的东东。题目起得是解析,但也没有特别细节的介绍,点到为止,有兴趣的Tx可以

superjoel的专栏 1万+

Model/View模块中Delegate的扩展:持久Delegate(一)

注:以下内容需要熟悉Qt的Model/View模块,如尚未掌握该模块的基础知识,不建议阅读。 在处理大规模,结构化数据的时候,Qt的Model/View非常好用,但其界面形式较为单一,不太符合日益增长的审美需求。有时候,Model/View在处理数据时,虽然可以完成相应的功能,但界面处理上总好像差点意思。 在Model/View中,Delegate负责数据项item的显示和交互,我们可以...

qq_34305316的博客 3483

Qt框架中Model/View模块的Delegate扩展实战

Qt Model/View体系是Qt框架中用于处理数据展示和交互的核心组件之一。该体系将数据源(Model)与界面展示(View)分离,通过中介角色(如Delegate)进行沟通,从而实现灵活且可扩展的用户界面设计。这种设计不仅提升了代码的可维护性,还增强了用户界面的响应性与交互性。在某些情况下,标准的编辑器组件无法满足特殊需求。此时,开发者需要通过继承一个基础的编辑器类并重写其方法来创建自定义的编辑器组件。创建自定义编辑器通常涉及以下几个步骤:继承基础编辑器类。

weixin_36304957的博客 1064

QT MVC 编程 MODEL/DELEGATE/VIEW(四)

Qt提供了一种略微不同于MVC(Model-View-Controller)的架构,称之为MVD(Model-View-Delgate)架构。即Controller实际上应由用户自己组合实现,Qt未提供专门的类来处理,Qt提供了一系列的Delegate协调Model和View,实现渲染、数据编辑和转换,不直接参与界面布局,而是与View配合进行细节控制以及将Model数据转换为View可用的格式。Qt 已经提供了一系列的Model、View、Delegate类以实现Model/View/Delegate架构

cnbizz的专栏 1087

基于STM32开发的智能语音控制系统

本文将介绍如何使用STM32微控制器开发一个智能语音控制系统,通过语音识别模块、OLED显示屏、Wi-Fi模块等实现对家用电器或其他设备的语音控制。智能语音控制系统的核心是STM32微控制器,通过语音识别模块识别用户的语音指令,并根据指令控制家用电器或其他设备。:定期测试语音识别模块、继电器控制模块、OLED显示屏和Wi-Fi模块的工作状态,确保系统能够在各种情况下正常运行,并保持智能语音控制系统的可靠性。本系统同样适用于办公环境,可以通过语音指令控制办公室设备,如照明、空调等,提供智能化的办公体验。

stm32d1219的博客 6911
上一篇: 新型肺炎感染人数数据图表化
下一篇: 数据结构线性表之顺序存储 类的封装
Pou光明
博客等级 码龄12年 3701粉丝 398原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值