у меня есть QTableView
в моем проекте, в котором несколько столбцов отображают данные, содержащие гиперссылку. Я использую класс делегата для них, чтобы настроить его так, чтобы при щелчке по ячейке в столбце он открывал связанную страницу в браузере. Это прекрасно работает … когда к одной странице привязано только одно значение. Например, у меня может быть список значений поиска для mysite.com, где столбцы имеют значения A, B, C и т. Д. Если пользователь щелкает ячейку в этом столбце с помощью A, он открывает гиперссылку для mysite. com / A (опять же, эта часть работает нормально). Однако теперь мне нужно добавить столбец, который может иметь что-то вроде «A, B», где он должен поддерживать ссылки для поиска A и B в той же ячейке, в зависимости от того, по какому клику они щелкают. Некоторое время я искал в Интернете, и, похоже, этого нельзя сделать с делегатом. У меня есть линия в QTextBrowser
в другом месте моего кода, где я могу сделать это через HTML, например так:
QString toShow;
for(int i = 0; i < searchValueList.size(); i++)
{
toShow.append("`<a href=\"www.mysite.com/" + searchValueList.at(i) + "\"`>" +
searchValueList.at(i) + "`</a`>";
}
Однако я не могу найти способ установить ячейки в QTableView
распознавать форматирование HTML или Rich Text, и, увы, я даже не уверен, что это возможно. Есть ли способ сделать то, что я пытаюсь сделать?
Вы можете создать кастом QItemDelegate
для конкретного столбца, в котором вы можете отобразить форматированный текст. Делегат может быть таким:
class RichTextDelegate: public QItemDelegate
{
public:
RichTextDelegate(QObject *parent = 0);
void paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
};
RichTextDelegate::RichTextDelegate(QObject *parent):QItemDelegate(parent)
{
}
void RichTextDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if( option.state & QStyle::State_Selected )
painter->fillRect( option.rect, option.palette.highlight() );painter->save();
QTextDocument document;
document.setTextWidth(option.rect.width());
QVariant value = index.data(Qt::DisplayRole);
if (value.isValid() && !value.isNull())
{
document.setHtml(value.toString());
painter->translate(option.rect.topLeft());
document.drawContents(painter);
}
painter->restore();
}
Вы должны установить делегат элемента для определенного столбца:
ui->tableView->setItemDelegateForColumn(colIndex, new RichTextDelegate(ui->tableView));
Теперь, если вы установите текст модели для определенного столбца в строке в форматированный текст, он будет отображаться правильно:
model->item(rowIndex, colIndex)->setText(someRichText);