对于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("<html> \
<head> \
<style> \
font{font-size:18px; color:white;} #f{font-size:26px; color: green;} \
</style> \
</head> \
<body>\
<font>%1</font><font id=\"f\">%2</font> \
<img src=\":/Images/logo\" width=\"40\" height=\"40\"> \
</body> \
</html>").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来进行文本的绘制,绘制区域通过整个文本区域经过坐标变换后得到的。

http://blog.csdn.net/liang19890820/article/details/50973099

最新文章

  1. 代码的坏味道(18)——依恋情结(Feature Envy)
  2. tn文本分析语言(二) 基本语法
  3. spring+task配置
  4. 《笨办法学C》笔记之基础语法
  5. IOS-App installation failed原因及解决方法
  6. mysql 语句执行顺序问题
  7. combobox中动态加入几个checkbox,实现下拉框多选
  8. UNIX环境高级编程-环境配置
  9. php判断服务器是否支持Gzip压缩功能
  10. 转换时间为 “XX分钟之前”
  11. java4中创建内对象的方法
  12. 【Oracle】-【体系结构】-【DBWR】-DBWR进程相关理解
  13. CentOS7安装最新版git教程
  14. workqueue --最清晰的讲解
  15. python 模块定义导入
  16. js+springMVC 提交数组数据到后台
  17. 【转载整理】mysql权限分配详解
  18. arttemplate记录
  19. iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a以及 FrameWork 的创建
  20. Linux下使用vim编辑C程序

热门文章

  1. Netbeans7.4下搭建struts2.3.16
  2. pl/sql执行动态sql
  3. DB2 中日期 比较
  4. 【CF 189A Cut Ribbon】dp
  5. IOS 监听通讯录是否改变
  6. Java遍历Map对象的四种方法
  7. python学习之路-12
  8. Good Teacher(模拟)
  9. 设置root远程连接ubuntu上mysql
  10. c++编程碰到的奇怪问题与解决