添加将超链接插入QTextBrowser的功能

时间:2017-05-19 17:04:41

标签: qt hyperlink pyqt qtextbrowser

我已经根据Peter Goldsborough的this example组装了一个文本编辑器。文本框从html填充,但显示为富文本。

我已经制作好了,因此用户可以点击文本框中已有的超链接。但是,我不知道从哪里开始添加功能,以便用户可以在编辑时添加自己的,新的可点击超链接。我非常感谢那些知道的人的指示!

(我特意试图避免采用的方法here - 这个家伙似乎正在使用一个解析器来扫描整个文档以获得类似链接的结构并添加html标签。这似乎更难,更多容易出错,我想知道是否只有一种方法可以用html标签包围突出显示的文本。)

我尝试了@ kuba-ober的下面的建议,但是因为我正在使用Python的Qt的PyQt4绑定,我修改了它:

def setHyperlinkOnSelection(self, url):
    cursor = self.text.textCursor()
    if not cursor.hasSelection():
        return False
    format = QtGui.QTextCharFormat()
    format.setAnchor(True)
    format.setAnchorHref(url)
    cursor.mergeBlockCharFormat(format)
    return True

不幸的是,这不起作用,但我用它来调整Goldsborough的example中的一些格式化方法,以产生以下结果:

def setHyperlinkOnSelection(self, url):

    # Grab the text's format
    fmt = self.text.currentCharFormat()

    # Set the format to an anchor with the specified url
    fmt.setAnchor(True)
    fmt.setAnchorHref(url)

    # And set the next char format
    self.text.setCurrentCharFormat(fmt)

这会产生一个链接(蓝色带下划线的文本,当转换为html时,使用" a href"标签)正确格式化,但它不可点击(用鼠标悬停在文本上没有&# 39; t改变到指针,点击不做任何事情...... ...

2 个答案:

答案 0 :(得分:0)

QTextBrowserQTextDocument进行操作。 html是QTextDocument表示的数据结构的表示格式。

链接解决方案中的方法不必要地对超文本表示进行操作,而高级QTextDocument结构更容易操作,因为它已经“解析”了逻辑结构 - 毕竟,{ {1}}是超文本AST的代表。

您需要使用文档的光标机制来操作选择并将其转换为超链接。即,QTextDocument为具有锚点的格式:

mergeBlockCharFormat

请注意,仅提供链接并不会使其充当链接。以下外部链接可能存在危险,您需要明确启用ii。如果您需要在浏览器中打开链接,请设置:

bool setHyperlinkOnSelection(QTextBrowser * browser, const QString & url) {
  auto doc = browser->document();
  QTextCursor cur(doc);
  if (!cur.hasSelection())
    return false;
  QTextCharFormat format;
  format.setAnchor(true);
  format.setAnchorHref(url);
  cur.mergeBlockCharFormat(format);
  return true;
}

即使browser->setOpenLinks(true); openLinks(这是默认值),也会发出false信号,您可以对其采取行动。

如果您需要在系统默认Web浏览器中打开外部链接,请设置:

anchorClicked

设置后,不会为这些链接发出browser->setOpenExternalLinks(true); 信号。

外部链接是指除anchorClickedfile以外的网址方案的链接。

答案 1 :(得分:0)

好的,我明白了 - 当qtextbrowser设置为只读模式时,链接不起作用。关于here的更多细节。如果有人知道如何克服Qt中这种明显的限制,我将不胜感激,但是现在我将通过在只读和可编辑模式之间快速切换来解决这个问题。