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