Ну, вы можете использовать делегаты для рендеринга форматированного текста в qtableview с пользовательскими делегатами, реализующими метод рисования, например:
void CHtmlDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItemV4 opt(option);
QLabel *label = new QLabel;
label->setText(index.data().toString());
label->setTextFormat(Qt::RichText);
label->setGeometry(option.rect);
label->setStyleSheet("QLabel { background-color : transparent; }");
painter->translate(option.rect.topLeft());
label->render(painter);
painter->translate(-option.rect.topLeft());
}
Однако гиперссылки не будут активными.
Для этого вы можете использовать следующий хак. Переопределите метод setModel вашего представления таблицы / списка и используйте setIndexWidget.
void MyView::setModel(QAbstractItemModel *m)
{
if (!m)
return;
QTableView::setModel(m);
const int rows = model()->rowCount();
for (int i = 0; i < rows; ++i)
{
QModelIndex idx = model()->index(i, 1);
QLabel *label = new QLabel;
label->setTextFormat(Qt::RichText);
label->setText(model()->data(idx, CTableModel::HtmlRole).toString());
label->setOpenExternalLinks(true);
setIndexWidget(idx, label);
}
}
В приведенном выше примере я заменяю столбец 1 на qlabels. Обратите внимание, что вам нужно аннулировать роль отображения в модели, чтобы избежать наложения данных.
В любом случае, мне было бы интересно найти лучшее решение, основанное на делегатах.