前言
在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);
}
最后的效果如下: