如何在QTableView的一个单元格中提供多个链接

时间:2014-07-24 20:08:44

标签: html c++ qt tableview

我的项目中有一个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,唉我甚至不确定是否可能。有什么方法可以做我想要完成的事情吗?

1 个答案:

答案 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);