添加向 QTextBrowser 插入超链接的功能
Posted
技术标签:
【中文标题】添加向 QTextBrowser 插入超链接的功能【英文标题】:Adding ability to insert hyperlinks to a QTextBrowser 【发布时间】:2017-05-19 17:04:41 【问题描述】:我一直在根据 Peter Goldsborough 的 this example 组装一个文本编辑器。文本框由 html 填充,但显示为富文本。
我已经做到了,这样用户就可以点击文本框中已经存在的超链接。但是,我不知道从哪里开始添加功能,以便用户可以在编辑时添加自己的新的可点击超链接。非常感谢知道的人指点!
(我特别想避免采用here 的方法 - 这个家伙似乎正在使用一个解析器来扫描整个文档以查找类似链接的结构并添加 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 的 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”标签正确格式化),但它不可点击(用鼠标悬停在文本上不会改变指向手,点击没有任何作用)...
【问题讨论】:
【参考方案1】:QTextBrowser
在 QTextDocument
上运行。 html是QTextDocument
所代表的数据结构的一种表示格式。
链接解决方案中的方法不必要地对超文本表示进行操作,而高级 QTextDocument
结构更容易操作,因为它的逻辑结构已经“解析” - 毕竟,QTextDocument
是超文本的 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);
即使openLinks
是false
(这是默认值),也会发出anchorClicked
信号并且您可以对其进行操作。
如果需要在系统默认浏览器中打开外部链接,设置:
browser->setOpenExternalLinks(true);
设置后,不会为这些链接发出 anchorClicked
信号。
外部链接是具有file
或qrc
以外的URL 方案的链接。
【讨论】:
谢谢@kuba-ober!这似乎让我成功了——我已经更新了上面的描述。【参考方案2】:好的,我想通了 - 当 qtextbrowser 设置为只读模式时,链接不起作用。有关here 的更多详细信息。如果有人知道如何克服 Qt 中的这一明显限制,我将不胜感激,但现在我将通过在只读模式和可编辑模式之间快速切换来解决这个问题。
【讨论】:
以上是关于添加向 QTextBrowser 插入超链接的功能的主要内容,如果未能解决你的问题,请参考以下文章
Python PyQt5 QTextBrowser 超链接丢失部分链接