html怎么渲染富文本,渲染-如何使项目视图在Q中渲染富文本(html)

我猜您可以使用treeview的setItemDelegate方法为您的treeview项目设置自定义绘画工具。 在委托的paint方法中,可以使用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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值