尝试使用setWordWrap(true),但是仅对中文有效,对英文不会自动换行,最后只能用代理。
代理实现
class WordWrapDelegate : public QStyledItemDelegate
{
public:using QStyledItemDelegate::QStyledItemDelegate;void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
void WordWrapDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{QStyleOptionViewItem opt = option;initStyleOption(&opt, index);// 创建一个 QTextDocument 并设置其内容QTextDocument doc;//设置样式QString html = QString("<div style='font-size: 16px;""font-family: Source Han Sans CN Regular;""font-weight: 400;""color:#FFFFFF; '>%1</div>").arg(opt.text);doc.setHtml(html);doc.setTextWidth(opt.rect.width());//doc.setHtml(opt.text);//如果不设置样式,就直接写这一句painter->save();// 绘制背景(包括选中状态/鼠标悬停状态)if ((opt.state & QStyle::State_Selected) || (opt.state & QStyle::State_MouseOver)) {painter->fillRect(opt.rect, opt.palette.highlight());}else {painter->fillRect(opt.rect, opt.palette.base());}// 调整 painter 的剪裁区域,以避免绘制超出单元格的内容painter->setClipRect(opt.rect);// 将文本绘制到单元格中QRect textRect = opt.rect;painter->translate(textRect.topLeft());doc.drawContents(painter);painter->restore();
}QSize WordWrapDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const
{QStyleOptionViewItem opt = option;initStyleOption(&opt, index);// 创建一个 QTextDocument 并设置其内容QTextDocument doc;//设置样式QString html = QString("<div style='font-size: 16px;""font-family: Source Han Sans CN Regular;""font-weight: 400;""color:#FFFFFF; '>%1</div>").arg(opt.text);doc.setHtml(html);doc.setTextWidth(opt.rect.width());//doc.setHtml(opt.text);return QSize(doc.idealWidth(), doc.size().height());
}
代理使用
//代理
WordWrapDelegate *delegate = new WordWrapDelegate(tableWidget);
tableWidget->setItemDelegate(delegate);//插入数据
...//设置自适应高度、宽度
tableWidget->setWordWrap(true);
tableWidget->resizeColumnsToContents();
tableWidget->resizeRowsToContents();