Qt之QTableView显示富文本

简述

对于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来进行文本的绘制,绘制区域通过整个文本区域经过坐标变换后得到的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值