目录
在前面的博客设置QTableView的内容自动换行(1)中,我介绍了如何利用setWordWrap实现换行。但是这样还是会造成末尾几个字被省略号代替。昨天在一个微信公众号“Qt教程”上看到一篇文章,介绍了用代理方法实现自动换行,且不会出现省略号。
关键代码:
定义代理:
#include "WrapDelegate.h"
#include <QPainter>
WrapDelegate::WrapDelegate(QObject * parent)
: QStyledItemDelegate(parent)
{
}
WrapDelegate::~WrapDelegate()
{
}
void WrapDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
auto text = index.model()->data(index, Qt::DisplayRole).toString();
//注意,这里必须用TextWrapAnywhere! TextWordWrap无效
painter->drawText(option.rect, Qt::TextWrapAnywhere | Qt::AlignVCenter, text);
}
这里注意,drawText里面一定要调用Qt::TextWrapAnywhere,这个选项决定了字符串只要超出单元格尺寸,就一定会在超出位置换行。而Qt::TextWordWrap只能在字符串标记"\n"的位置换行。
使用代理:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItem>
#include "WrapDelegate.h"
#include <QTableView>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for (int k = 0; k < 3; k++)
{
QStandardItem * pItem = new QStandardItem(QString("%1").arg(k, 20, 10, QChar('0')));
pItem->setEditable(true);
m_lstItems << pItem;
}
m_model.appendRow(m_lstItems);
QStringList lstHeader;
lstHeader << QString::fromWCharArray(L"类型") << QString::fromWCharArray(L"名称")
<< QString::fromWCharArray(L"样式");
m_model.setHorizontalHeaderLabels(lstHeader);
auto pTable = new QTableView;
pTable->setModel(&m_model);
setCentralWidget(pTable);
//使用代理:
auto pDelegate0 = new WrapDelegate();
auto pDelegate1 = new WrapDelegate();
auto pDelegate2 = new WrapDelegate();
pTable->setItemDelegateForColumn(0, pDelegate0);
pTable->setItemDelegateForColumn(1, pDelegate1);
pTable->setItemDelegateForColumn(2, pDelegate2);
//pTable->resizeRowsToContents();
}
MainWindow::~MainWindow()
{
delete ui;
}
完整代码可以在我的资源下载设置QTableView的内容自动换行,代理方式