1

我一直在根据Peter Goldsborough的这个例子组装一个文本编辑器。文本框由 html 填充,但显示为富文本。

我已经做到了,这样用户就可以点击文本框中已经存在的超链接。但是,我不知道从哪里开始添加功能,以便用户可以在编辑时添加自己的、新的可点击超链接。非常感谢知道的人的指点!

(我特别想避免这里采用的方法——这个家伙似乎正在使用一个解析器,它扫描整个文档以寻找类似链接的结构并添加 html 标签。这似乎比它需要的更难,更容易出错是,我想知道是否有一种方法可以用 html 标签包围突出显示的文本。)

我尝试了@kuba-ober 的以下建议,但由于我正在使用 Qt for Python 的 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示例中的一些格式化方法,以产生以下结果:

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”标签正确格式化),但它不可点击(用鼠标悬停在文本上不会变成指向手,并且点击什么都不做)...

4

2 回答 2

0

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

于 2017-05-29T02:21:09.747 回答
0

AQTextBrowser对 进行操作QTextDocument。html是代表的数据结构的一种表示格式QTextDocument

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

您需要使用文档的游标机制对所选内容进行操作并将其变成超链接。即,mergeBlockCharFormat带有锚的格式:

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

请注意,仅提供链接并不能使其充当链接。跟随外部链接有潜在危险,您需要明确启用 ii. 如果您需要在浏览器本身中打开链接,请设置:

browser->setOpenLinks(true);

即使openLinksfalse(这是默认设置),anchorClicked也会发出信号并且您可以对其进行操作。

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

browser->setOpenExternalLinks(true);

设置后,anchorClicked不会为这些链接发出信号。

外部链接是具有除file或之外的 URL 方案的链接qrc

于 2017-05-19T19:42:56.853 回答