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

4

我的项目中有一个QTableView,其中几列显示包含超链接的数据。我使用委托类对这些进行设置,以便在单击列中的单元格时,会在浏览器中打开链接的页面。当只有一个值链接到一个页面时,这很好用。例如,我可能会有一个搜索值列表,其中列具有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格式或富文本,而且遗憾的是我甚至不确定是否可能。有没有任何方法可以实现我想要完成的目标呢?

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接