我想你可以使用树形视图的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, "<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);
...
自定义委托执行
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();
}
请注意,如果optionV4.state的帐户处于非活动状态,则ctx.palette.setcolor部分需要额外的嵌套。否则,当你移动到另一个窗口时,文本变得几乎不可读。否则工作很好。谢谢 – mmccoo 2010-12-30 14:41:32
文字颜色注意:使用'else ctx.palette.setColor(QPalette :: Text,optionV4.palette.color(QPalette :: Active,QPalette :: Text));'以确保正确设置文字颜色。通过样式表使用非默认文本颜色时需要。 – 2014-05-16 13:52:46
QTextDocument设置:如果添加'doc.setDocumentMargin(0); doc.setDefaultFont(optionV4.font);'(将其添加到paint&sizeHint中),那么当您通过样式表更改字体时,字体将是正确的。此外,sizeHint例程中的'doc.setTextWidth'调用似乎没有任何作用。如果将它放在'sizeHint'和'paint'方法中,那么当单词的列缩小时,可以让单词消失而不是被截断。 – 2014-05-16 13:56:23