1. 程式人生 > >QTableView中使用Delegate方式來實現對特定列的文本進行換行

QTableView中使用Delegate方式來實現對特定列的文本進行換行

dwr raw pan 文本 detail ring -s dem 代碼

問題:由於表格的一個列中,有個別文本過長,默認情況下,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

QTableView中使用Delegate方式來實現對特定列的文本進行換行