Qt tips 之 QTableView 富文本显示

参考一去、二三里:Qt 之 QTableView 显示富文本ChatGPT3.5
特别鸣谢一去、二三里

前言

本文实现 QTableView 富文本显示,同样适用于QTreeView、QListView 等 Q*View 控件。
相比参考博客增加了文本居中、多行显示优化等。

代码实现

RichTextDelegate 类声明(部分实现省略):

class RichTextDelegate : public QStyledItemDelegate
{
}

RichTextDelegate 类实现(部分实现省略):

void RichTextDelegate::paint(QPainter* painter,
                             const QStyleOptionViewItem& option,
                             const QModelIndex& index) const
{
	// 第一列富文本
    if (0 == index.column())
    {
        QStyleOptionViewItem opt(option);
        initStyleOption(&opt, index);

        // 清空文本
        opt.text = "";
        QStyle* pStyle = opt.widget ? opt.widget->style() : QApplication::style();
        pStyle->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);

        // 文本可用显示区域
        QRect textRect = pStyle->subElementRect(QStyle::SE_ItemViewItemText, &opt);
        painter->save();

        // 设置 html 文本
        QString html = index.data(Qt::UserRole + 1).toString();
        QTextDocument doc;
        // html 文本居中显示
        QTextOption textOpt = doc.defaultTextOption();
        textOpt.setAlignment(Qt::AlignCenter);
        doc.setDefaultTextOption(textOpt);
        doc.setTextWidth(textRect.width());
        doc.setHtml(html);

        // 坐标转换,painter 从原点开始绘制,将文本区域左上角转化为原点
        // 经验证,doc.size().height() 可能会比 textRect.height() 大
        // 所以根据文本区域大小和 QTextDocument 区域大小手动算原点位置
        int orignX = textRect.left() + (textRect.width() - doc.size().width()) / 2;
        int orignY = textRect.top() + (textRect.height() - doc.size().height()) / 2;
        painter->translate(orignX, orignY);

        // 设置 html 绘制区域
        QRect htmlRect(0, 0, doc.size().width(), doc.size().height());
        painter->setClipRect(htmlRect);

        QAbstractTextDocumentLayout::PaintContext paintContext;
        doc.documentLayout()->draw(painter, paintContext);
        painter->restore();
    }
    else
    {
        QStyledItemDelegate::paint(painter, option, index);
    }
}
QSize RichTextDelegate::sizeHint(const QStyleOptionViewItem& option, 
							     const QModelIndex& index) const
{
    QSize size = QStyledItemDelegate::sizeHint(option, index);

    // 自定义端面命名表格最小行高为 32px
    size.setHeight(qMax(size.height(), 32));
    return size;
}

QTableView 类实现(部分实现省略):

// 设置默认行高 32px、自适应高度、文本换行
this->verticalHeader()->setDefaultSectionSize(32);
this->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
this->setWordWrap(true);

// 设置代理 RichTextDelegate 
RichTextDelegate * pDelegate = new RichTextDelegate (this);
this->setItemDelegate(pDelegate );

// QTableView 添加数据
QStandardItem* pItem = new QStandardItem();
pItem->setData(text, Qt::DisplayRole);
pItem->setData(html, Qt::UserRole + 1);
pItem->setTextAlignment(Qt::AlignCenter);
m_pDataModel->setItem(row, column, pItem);

HTML 代码

<html>
<head>
	<style>
		.NormalText
		{
			font-family: "Microsoft YaHei UI";
			font-size: 14px;
			color: #F5F9FC;
		}
		.HighlightText
		{
			font-family: "Microsoft YaHei UI";
			font-size: 14px;
			color: #14CDBA;
		}
	</style>
</head>
<body>
	<font class = "NormalText">NormalText</font>
	<font class = "HighlightText">HighlightText</font>
</body>
</html>
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QTableView显示富文本的单元格,可以通过设置QStandardItemModel模型的setData()函数,并将富文本字符串作为数据项传递给它。 首先,我们需要创建一个QStandardItemModel模型对象,并设置它的行数和列数。然后,我们可以使用setItem()函数将每个单元格中的数据项设置为富文本。 接下来,我们可以使用toHtmlEscaped()函数将富文本字符串转换为Html转义字符,这样可以确保特殊字符正常显示。然后,将富文本字符串设置为数据项。 最后,将QStandardItemModel设置为QTableView的模型即可显示富文本。 下面是一个示例代码: ```cpp #include <QTableView> #include <QStandardItemModel> #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建模型 QStandardItemModel model(3, 3); // 设置富文本数据 QString richText = "<font color=\"red\">红色</font> <b>加粗</b>"; for(int row = 0; row < model.rowCount(); ++row) { for(int column = 0; column < model.columnCount(); ++column) { // 将富文本字符串转换为Html转义字符 QString html = richText.toHtmlEscaped(); // 设置数据项 QStandardItem* item = new QStandardItem(); item->setData(html, Qt::DisplayRole); // 设置单元格 model.setItem(row, column, item); } } // 创建视图 QTableView tableView; tableView.setModel(&model); tableView.show(); return a.exec(); } ``` 这样,QTableView中的每个单元格都将以富文本字符串的样式显示。请注意,如果你想在单元格中显示更复杂的富文本样式,可以使用更多的Html标签和属性来定制富文本字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值