我的项目中有一个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,唉我甚至不确定是否可能。有什么方法可以做我想要完成的事情吗?
答案 0 :(得分:7)
您可以为可以在其中显示富文本的特定列创建自定义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);