Я думаю, вы можете использовать метод древовидной структуры setItemDelegate, чтобы настроить пользовательский маляр для ваших элементов дерева. В методе рисования делегата вы можете использовать QTextDocument для загрузки текста элемента в виде html и его рендеринга. Пожалуйста, проверьте, если ниже пример будет работать для вас:
инициализации TreeView:
...
// 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();
}
Обратите внимание, что раздел ctx.palette.setcolor нуждается в дополнительном вложенном, если учетная запись для опцииV4.state неактивна.В противном случае при переходе в другое окно текст становится почти нечитаемым. Отлично работает. Спасибо – mmccoo
Замечание цвета текста: используйте 'else ctx.palette.setColor (QPalette :: Text, optionV4.palette.color (QPalette :: Active, QPalette :: Text));' чтобы убедиться, что цвет текста правильно установлен. Требуется при использовании цветов текста, отличных от по умолчанию, через таблицу стилей. –
QTextDocument setup: Если вы добавите 'doc.setDocumentMargin (0); doc.setDefaultFont (optionV4.font); '(добавьте его как в paint & sizeHint), тогда шрифты будут правильными, когда вы измените их с помощью таблицы стилей. Кроме того, вызов 'doc.setTextWidth' в процедуре sizeHint, похоже, ничего не делает. Если вы поместите его как в методы 'sizeHint', так и' paint', вы можете потерять слова вместо обрезания, когда столбец элемента сжимается. –