gpt4 book ai didi

qt - 如何使项目 View 在 Qt 中呈现富(html)文本

转载 作者:行者123 更新时间:2023-12-02 20:50:03 29 4
gpt4 key购买 nike

假设我的模型具有以下 Qt::DisplayRole 字符串的项目

<span>blah-blah <b>some text</b> other blah</span>

我希望 QTreeView (实际上,任何项目 View )将其呈现为富文本。相反,项目 View 默认将其呈现为纯文本。如何达到想要的渲染效果?

<小时/>

实际上,这是一个搜索结果模型。用户输入文本,根据该文本搜索某些文档,并向用户显示搜索结果,其中正在搜索的单词应比周围的文本更粗体。

最佳答案

我想你可以使用setItemDelegate TreeView 的方法为您的 TreeView 项目设置自定义画家。在委托(delegate)的绘制方法中,您可以使用 QTextDocument 将项目的文本加载为 html 并渲染它。请检查以下示例是否适合您:

树形 View 初始化:

...
// 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, "<span>blah-blah <b>some text</b> other blah</span>");
}
// create custom delegate
HTMLDelegate* delegate = new HTMLDelegate();
// set model and delegate to the treeview object
ui->treeView->setModel(model);
ui->treeView->setItemDelegate(delegate);
...

自定义委托(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();
}

关于qt - 如何使项目 View 在 Qt 中呈现富(html)文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1956542/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com