qt html 文本,如何使项目视图渲染富(html)文本在Qt

我想你可以使用树视图的

setItemDelegate方法为您的树视图项目设置自定义画家。在委托的绘制方法中,您可以使用QTextDocument将项目的文本加载为HTML并进行渲染。请检查以下示例是否适用于您:

树视图初始化:

...

// create simple model for a tree view

QStandardItemModel *model = new QStandardItemModel();

QModelIndex parentItem;

for (int i = 0; i < 4; ++i)

{

parentItem = model->index(0, 0, parentItem);

model->insertRows(0, 1, parentItem);

model->insertColumns(0, 1, parentItem);

QModelIndex index = model->index(0, 0, parentItem);

model->setData(index, "blah-blah some text other blah");

}

// create custom delegate

HTMLDelegate* delegate = new HTMLDelegate();

// set model and delegate to the treeview object

ui->treeView->setModel(model);

ui->treeView->setItemDelegate(delegate);

...

自定义委托实现

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 options = option;

initStyleOption(&options, index);

painter->save();

QTextDocument doc;

doc.setHtml(options.text);

options.text = "";

options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter);

painter->translate(options.rect.left(), options.rect.top());

QRect clip(0, 0, options.rect.width(), options.rect.height());

doc.drawContents(painter, clip);

painter->restore();

}

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

{

QStyleOptionViewItemV4 options = option;

initStyleOption(&options, index);

QTextDocument doc;

doc.setHtml(options.text);

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

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

}

希望这有帮助,问候

update0:更改为HTMLDelegate以使图标可见,并为所选项目使用不同的笔颜色

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

{

QStyleOptionViewItemV4 options = option;

initStyleOption(&options, index);

painter->save();

QTextDocument doc;

doc.setHtml(options.text);

options.text = "";

options.widget->style()->drawControl(QStyle::CE_ItemViewItem, &options, painter);

// shift text right to make icon visible

QSize iconSize = options.icon.actualSize(options.rect.size());

painter->translate(options.rect.left()+iconSize.width(), options.rect.top());

QRect clip(0, 0, options.rect.width()+iconSize.width(), options.rect.height());

//doc.drawContents(painter, clip);

painter->setClipRect(clip);

QAbstractTextDocumentLayout::PaintContext ctx;

// set text color to red for selected item

if (option.state & QStyle::State_Selected)

ctx.palette.setColor(QPalette::Text, QColor("red"));

ctx.clip = clip;

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

painter->restore();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值