在 QTextBrowser 中以不同方式处理不同的链接
Posted
技术标签:
【中文标题】在 QTextBrowser 中以不同方式处理不同的链接【英文标题】:Handling different links differently in QTextBrowser 【发布时间】:2017-05-30 02:49:59 【问题描述】:我正在尝试设置一个 QTextBrowser,其中大多数超链接正常工作,但以任意前缀开头的超链接将改为调用函数。
@three-pineapples 提供了一些很好的说明 here 来说明如何实现后一种行为,检测 url 上的前缀并基于该 url 调用方法。
问题是,为了让它工作,QTextBrowser 的setOpenLinks()
方法必须设置为False
,这样QTextBrowser 才会发出anchorClicked()
信号。否则,前缀链接将由 Qt 自动处理并且没有自定义行为。但是如果我设置setOpenLinks() False
,那么普通的链接现在就不能正常工作了。
任何想法如何在setOpenLinks()
设置False
的环境中手动重新实现链接处理,或者在设置True
的环境中获取前缀链接的自定义行为?感谢您的帮助!
【问题讨论】:
【参考方案1】:方法一:完全控制(但复制Qt代码)
如果您想要完全控制,请使用 setOpenLinks(false)
禁用 Qt 的链接处理机制,并根据普通链接的 Qt 实现 (QTextBrowserPrivate::_q_activateAnchor
) 完全自己实现链接处理:
bool isFileScheme = url.scheme() == QLatin1String("file") #if defined(Q_OS_android) || url.scheme() == QLatin1String("assets") #endif || url.scheme() == QLatin1String("qrc"); if ((openExternalLinks && !isFileScheme && !url.isRelative()) || (url.isRelative() && !currentURL.isRelative() && !isFileScheme)) QDesktopServices::openUrl(url); return; q->setSource(url);
因此,使用QTextBrowser::setSource
打开网址或使用QDesktopServices::openUrl
在外部打开它。
方法二:综合方法
使用setOpenLinks(true)
启用Qt 的链接处理机制。 anchorClicked
通常会在链接具有文件方案时发出,或者更确切地说,当以下条件失败时会发出:
if ((openExternalLinks && !isFileScheme && !url.isRelative()) || (url.isRelative() && !currentURL.isRelative() && !isFileScheme))
如果不调用setSource
或者更改QTextDocument
的内容,源会自动设置为点击的url。
【讨论】:
以上是关于在 QTextBrowser 中以不同方式处理不同的链接的主要内容,如果未能解决你的问题,请参考以下文章
VBA 在 Excel 2016 中以不同方式处理日期?有这方面的文件吗?
如何在简单的 ANTLR 词法分析器中以不同的方式处理 <script> 标签?