QT怎么让模型数据在视图中用自定义组件显示?(通过重写委托中的paint函数)

本文介绍了如何在QT中,通过使用委托和重写QStyledItemDelegate的paint函数,将模型数据以QProgressBar形式显示,实现对数据的非文本形式呈现。
摘要由CSDN通过智能技术生成

前言

在QT使用模型视图时,模型中的数据一般会以文字的形式展现,但是如果我想以其他的形式显示,应该用什么方法呢?

分析

经过查询,可以得到要用特殊的方式来处理模型,要使用委托(Delegate)

委托是一种用于控制和自定义视图(View)中项(Item)的外观和编辑行为的机制。委托通常用于QTableViewQTreeView等控件,以在视图中显示或编辑模型中的数据。

因此,通过重写QT委托类中的paint函数,即可实现对模型数据的自定义显示。

实现

  1. 首先创建一个3×3的QStandardItemModel,将每个值设置成20并使用tableview显示。
  2. 然后新建一个类,继承一个委托类(QItemDelegate 和 QStyledItemDelegate都可以),并且声明重写paint函数。
class delegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit delegate(QObject *parent = nullptr);
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};

        3. 然后重写paint函数,这里使用QProgressBar来显示20这个值。

void delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    //获取当前项在表格中的矩形区域
    QRect rect = option.rect;
    if(index.row() == 0){
        //数据模型中获取当前项的数据
        qreal data = index.data().toReal();
        QProgressBar bar;
        bar.setValue(data);
        //设置对象形状和表格相匹配
        bar.setGeometry(rect);
        QPixmap pixmap(rect.size());
        //将对象渲染到QPixmap上
        bar.render(&pixmap);
        painter->drawPixmap(rect, pixmap);
    }else
        QStyledItemDelegate::paint(painter, option, index);
}

最后的效果如下:

 

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值