博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt之QTableView显示富文本
阅读量:5743 次
发布时间:2019-06-18

本文共 1696 字,大约阅读时间需要 5 分钟。

简述

对于QTableView中的显示,我们前面介绍过很多种,其中包括:文本、进度条、复选框等,今天我们介绍一下关于富文本的显示。

可能绝大多数小伙伴会通过QAbstractTableModel中的data来实现,可是现实告诉我们,那是行不通的,那么我们如何去显示呢?请看正文。

效果

这里写图片描述

源码

下面我们使用QAbstractItemDelegate来进行富文本的显示,主要通过QTextDocument设置HTML代码来实现。

void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{    QStyleOptionViewItem viewOption(option);    initStyleOption(&viewOption, index);    if (option.state.testFlag(QStyle::State_HasFocus))        viewOption.state = viewOption.state ^ QStyle::State_HasFocus;    // ... 省略    // 设置显示文本为空,使用默认样式    QStyle *pStyle = viewOption.widget? viewOption.widget->style() : QApplication::style();    viewOption.text = "";    pStyle->drawControl(QStyle::CE_ItemViewItem, &viewOption, painter, viewOption.widget);    // 需要显示的HTML    QString strHTML = QString(" \                               \                               \                               \                              \                              %1%2 \                               \                               \                              ").arg("I am a ").arg("Qter");    QTextDocument doc;    doc.setHtml(strHTML);    QAbstractTextDocumentLayout::PaintContext paintContext;    QRect textRect = pStyle->subElementRect(QStyle::SE_ItemViewItemText, &viewOption);    painter->save();    // 坐标变换,将左上角设置为原点    painter->translate(textRect.topLeft());    // 设置HTML绘制区域    painter->setClipRect(textRect.translated(-textRect.topLeft()));    doc.documentLayout()->draw(painter, paintContext);    painter->restore();}

分析

首先我们需要保留原有样式,所以设置QStyleOptionViewItem的文本为空,然后调用QStyle的drawControl接口来进行绘制,然后通过QTextDocument设置HTML代码,利用QPainter来进行文本的绘制,绘制区域通过整个文本区域经过坐标变换后得到的。

你可能感兴趣的文章
任意长度的两个正整数相乘
查看>>
(转)Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议
查看>>
oracle数据库_实例_用户_表空间之间的关系
查看>>
php面向对象--简介
查看>>
colors.xml
查看>>
移动端兼容性问题
查看>>
一些SQL命令
查看>>
基于WDF的PCI/PCIe接口卡Windows驱动程序(1)-WDF概述及开发环境搭建
查看>>
文艺青年、普通青年、2b青年到底是什么意思?
查看>>
VBA 打开带密码的文件
查看>>
super 使用注意说明
查看>>
软件需求模式阅读笔记之二
查看>>
谈面向对象的三大特征
查看>>
第二节 设计和实现服务协定
查看>>
linux中断响应和处理过程
查看>>
进入博客园的第一天
查看>>
计算机图形学实验一
查看>>
刷题练习记录(2)——两数相加(JAVA 和 Python)【链表】
查看>>
经典T-SQL代码
查看>>
[翻译]Mock 在 Python 中的使用介绍
查看>>