我正在尝试设置一个QTextBrowser,其中大多数超链接正常工作,但以任意前缀开头的超链接将调用一个函数。
@ three-pineapples为如何实现后一种行为,检测网址上的前缀以及根据该网址调用方法提供了一些很好的指令here。
问题是,为了使其工作,必须将QTextBrowser的setOpenLinks()
方法设置为False
,以便QTextBrowser发出anchorClicked()
信号。否则,前缀链接由Qt自动处理,没有自定义行为。但是,如果我设置setOpenLinks() False
,普通链接现在无法正常工作。
如何在setOpenLinks()
设置False
的环境中手动重新实现链接处理的任何想法,或者在设置它的环境中的前缀链接上获取自定义行为{{1 }}?谢谢你的帮助!
答案 0 :(得分:1)
方法1:完全控制(但重复Qt代码)
如果您想要完全控制,请使用setOpenLinks(false)
禁用Qt的链接处理机制,并根据正常链接的Qt实现(QTextBrowserPrivate::_q_activateAnchor
)自行实现链接处理:< / p>
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
在外部打开网址。
方法2:综合方法
使用setOpenLinks(true)
启用Qt的链接处理机制。当链接具有文件方案时,通常会发出anchorClicked
,或者在以下条件失败时更准确地发出if ((openExternalLinks && !isFileScheme && !url.isRelative())
|| (url.isRelative() && !currentURL.isRelative() && !isFileScheme))
:
child://
如果您不致电setSource
或更改QTextDocument
的内容,则来源将自动设置为点击的网址。