添加向 QTextBrowser 插入超链接的能力
Adding ability to insert hyperlinks to a QTextBrowser
我一直在组装一个基于 Peter Goldsborough 的 this example 的文本编辑器。文本框由 html 填充,但显示为富文本。
我这样做是为了让用户能够点击文本框中已有的 hyperlink。但是,我不知道从哪里开始添加功能,以便用户可以在编辑时添加他们自己的 、新的 可点击 hyperlink。有知道的朋友指点一下,不胜感激!
(我特别试图避免采用 here 的方法 - 这个家伙似乎正在使用一个解析器扫描整个文档以寻找类似 link 的结构并添加 html 标签。这似乎比它需要的更难和更容易出错,我想知道是否有一种方法可以用 html 标签包围突出显示的文本。)
我尝试了@kuba-ober 下面的建议,尽管因为我在 Qt 的 PyQt4 绑定中工作 Python,我修改了它:
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)
这会导致 link(带蓝色下划线的文本,当转换为 html 时,使用 "a href" 标记正确格式化),但它不可点击(悬停在使用鼠标的文本不会更改为指向手,并且单击不会执行任何操作)...
A QTextBrowser
在 QTextDocument
上运行。 html是QTextDocument
表示的数据结构的表示格式。
您 linked 解决方案中的方法不必要地对超文本表示进行操作,而高级 QTextDocument
结构更容易操作,因为它已经具有逻辑结构 "parsed out" - 毕竟,QTextDocument
是超文本 AST 的表示。
需要利用文档的游标机制对选区进行操作,将选区变成超link。即,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;
}
请注意,仅提供 link 并不能使其充当 link。跟随外部 links 有潜在危险,您需要明确启用 ii。如果您需要在浏览器本身中打开 links,请设置:
browser->setOpenLinks(true);
即使 openLinks
是 false
(这是默认设置),也会发出 anchorClicked
信号,您可以对其进行操作。
如果需要在系统默认浏览器中打开外部links,设置:
browser->setOpenExternalLinks(true);
设置后,anchorClicked
信号不会在 link 秒后发出。
外部 link 是具有 URL 方案而不是 file
或 qrc
的 link。
好的,我明白了 - 当 qtextbrowser 设置为只读模式时,链接不起作用。有关 here 的更多详细信息。如果有人知道如何克服 Qt 中的这种明显限制,我将不胜感激,但现在我将通过在只读模式和可编辑模式之间快速切换来解决这个问题。
我一直在组装一个基于 Peter Goldsborough 的 this example 的文本编辑器。文本框由 html 填充,但显示为富文本。
我这样做是为了让用户能够点击文本框中已有的 hyperlink。但是,我不知道从哪里开始添加功能,以便用户可以在编辑时添加他们自己的 、新的 可点击 hyperlink。有知道的朋友指点一下,不胜感激!
(我特别试图避免采用 here 的方法 - 这个家伙似乎正在使用一个解析器扫描整个文档以寻找类似 link 的结构并添加 html 标签。这似乎比它需要的更难和更容易出错,我想知道是否有一种方法可以用 html 标签包围突出显示的文本。)
我尝试了@kuba-ober 下面的建议,尽管因为我在 Qt 的 PyQt4 绑定中工作 Python,我修改了它:
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)
这会导致 link(带蓝色下划线的文本,当转换为 html 时,使用 "a href" 标记正确格式化),但它不可点击(悬停在使用鼠标的文本不会更改为指向手,并且单击不会执行任何操作)...
A QTextBrowser
在 QTextDocument
上运行。 html是QTextDocument
表示的数据结构的表示格式。
您 linked 解决方案中的方法不必要地对超文本表示进行操作,而高级 QTextDocument
结构更容易操作,因为它已经具有逻辑结构 "parsed out" - 毕竟,QTextDocument
是超文本 AST 的表示。
需要利用文档的游标机制对选区进行操作,将选区变成超link。即,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;
}
请注意,仅提供 link 并不能使其充当 link。跟随外部 links 有潜在危险,您需要明确启用 ii。如果您需要在浏览器本身中打开 links,请设置:
browser->setOpenLinks(true);
即使 openLinks
是 false
(这是默认设置),也会发出 anchorClicked
信号,您可以对其进行操作。
如果需要在系统默认浏览器中打开外部links,设置:
browser->setOpenExternalLinks(true);
设置后,anchorClicked
信号不会在 link 秒后发出。
外部 link 是具有 URL 方案而不是 file
或 qrc
的 link。
好的,我明白了 - 当 qtextbrowser 设置为只读模式时,链接不起作用。有关 here 的更多详细信息。如果有人知道如何克服 Qt 中的这种明显限制,我将不胜感激,但现在我将通过在只读模式和可编辑模式之间快速切换来解决这个问题。