QT怎么让模型数据在视图中用自定义组件显示?(通过重写委托中的paint函数)
Eureka就是尤里卡
已于 2024-01-19 09:47:24 修改
阅读量495
收藏 11
点赞数 11
文章标签: qt 开发语言 经验分享 qt5 c++
版权
本文介绍了如何在QT中,通过使用委托和重写QStyledItemDelegate的paint函数,将模型数据以QProgressBar形式显示,实现对数据的非文本形式呈现。
摘要由CSDN通过智能技术生成
前言
在QT使用模型视图时,模型中的数据一般会以文字的形式展现,但是如果我想以其他的形式显示,应该用什么方法呢?
分析
经过查询,可以得到要用特殊的方式来处理模型,要使用委托(Delegate)
委托是一种用于控制和自定义视图(View)中项(Item)的外观和编辑行为的机制。委托通常用于QTableView、QTreeView等控件,以在视图中显示或编辑模型中的数据。
因此,通过重写QT委托类中的paint函数,即可实现对模型数据的自定义显示。
实现
首先创建一个3×3的QStandardItemModel,将每个值设置成20并使用tableview显示。
然后新建一个类,继承一个委托类(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);
}
最后的效果如下:
Eureka就是尤里卡
关注
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/buhuiCyvyan/article/details/135679086