为了账号安全,请及时绑定邮箱和手机立即绑定

如何使项目视图在Qt中呈现富文本(html)

如何使项目视图在Qt中呈现富文本(html)

假设我的模型中包含以下项目的Qt :: DisplayRole字符串<span>blah-blah <b>some text</b> other blah</span>我想要QTreeView(实际上是任何项目视图)将其呈现为富文本格式。而是,项目视图默认情况下将其呈现为纯文本。如何实现所需的渲染?实际上,这是一个搜索结果模型。用户输入文本,针对该文本搜索某些文档,然后向用户显示搜索结果,其中要搜索的单词应比周围的文本大胆。
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

我的答案主要是受@serge_gubenko的启发。但是,做了一些改进,使代码最终在我的应用程序中有用。


class HtmlDelegate : public QStyledItemDelegate

{

protected:

    void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;

    QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;

};


void HtmlDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

{

    QStyleOptionViewItemV4 optionV4 = option;

    initStyleOption(&optionV4, index);


    QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style();


    QTextDocument doc;

    doc.setHtml(optionV4.text);


    /// Painting item without text

    optionV4.text = QString();

    style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter);


    QAbstractTextDocumentLayout::PaintContext ctx;


    // Highlighting text if item is selected

    if (optionV4.state & QStyle::State_Selected)

        ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));


    QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);

    painter->save();

    painter->translate(textRect.topLeft());

    painter->setClipRect(textRect.translated(-textRect.topLeft()));

    doc.documentLayout()->draw(painter, ctx);

    painter->restore();

}


QSize HtmlDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const

{

    QStyleOptionViewItemV4 optionV4 = option;

    initStyleOption(&optionV4, index);


    QTextDocument doc;

    doc.setHtml(optionV4.text);

    doc.setTextWidth(optionV4.rect.width());

    return QSize(doc.idealWidth(), doc.size().height());

}


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 1550 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信