QTableView中使用Delegate方式来实现对特定列的文本进行换行

问题:由于表格的一个列中,有个别文本过长,默认情况下,QTableView不支持对某列的文本换行,所以需要通过Delegate方式来实现这样的效果

头文件的Delegate

 1 #pragma once
 2 
 3 #include <QStyledItemDelegate>
 4 #include <QPainter>
 5 
 6 class WrapTextDelegate : public QStyledItemDelegate
 7 {
 8     Q_OBJECT
 9 
10 public:
11     explicit WrapTextDelegate(QObject *parent = Q_NULLPTR);
12     ~WrapTextDelegate();
13 
14 public:
15     void paint(QPainter *painter, const QStyleOptionViewItem &option,
16         const QModelIndex &index) const override;
17 };

Delegate实现文件:

 1 #include "WrapTextDelegate.h"
 2 
 3 WrapTextDelegate::WrapTextDelegate(QObject *parent)
 4     : QStyledItemDelegate(parent)
 5 {
 6 }
 7 
 8 WrapTextDelegate::~WrapTextDelegate()
 9 {
10 }
11 
12 void WrapTextDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
13 {
14     (void)(index);
15     
16     QString text = index.model()->data(index, Qt::DisplayRole).toString();
17     //绘制文本  
18     painter->drawText(option.rect, Qt::TextWordWrap | Qt::AlignVCenter | Qt::AlignLeft, text);
19     //如果当前有焦点,就绘制一个焦点矩形,否则什么都不做  
20    // drawFocus(painter, option, option.rect);
21 
22 
23 }

 

最后在初始化QTableView的代码中写下:

1 auto delegate = new WrapTextDelegate();
2 
3 ui->table->setItemDelegateForColumn(column, delegate);

这样就完成了。如果你想用setTextElideMode(Qt::TextElideMode mode)来达到Wrap文本的效果,也可以,不过我觉得这么做不太美观。

 

references:
http://www.cppblog.com/biao/archive/2009/08/07/92577.html
http://blog.csdn.net/xbnlkdbxl/article/details/51396336
http://bbs.csdn.net/topics/390834107

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值