在 QTextBrowser 中以不同方式处理不同的链接
Handling different links differently in QTextBrowser
我正在尝试设置一个 QTextBrowser,其中大多数 hyperlinks 都可以正常工作,但是以任意前缀开头的 hyperlinks 将调用一个函数。
@three-pineapples 提供了一些很好的说明 here 如何实现后一种行为,检测 url 上的前缀并调用基于该 url 的方法。
问题是,为了使其工作,必须设置 QTextBrowser 的 setOpenLinks()
方法 False
以便 QTextBrowser 发出 anchorClicked()
信号。否则,带前缀的 link 由 Qt 自动处理并且没有自定义行为。但是如果我设置 setOpenLinks() False
,正常的 links 现在不能正常工作。
关于如何在 setOpenLinks()
设置 False
的环境中重新实现 link 手动处理的任何想法,或者在前缀 link 上获得自定义行为s在设置的环境中True
?感谢您的帮助!
方法一:完全控制(但复制Qt代码)
如果您想完全控制,请使用 setOpenLinks(false)
禁用 Qt 的 link 处理机制,并根据 Qt 实现(QTextBrowserPrivate::_q_activateAnchor
完全实现 link 自己处理) 对于正常 links:
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
or open it externally using QDesktopServices::openUrl
打开 url。
方法二:综合法
使用 setOpenLinks(true)
启用 Qt 的 link 处理机制。 anchorClicked
通常会在 link 有一个文件方案时发出,或者更确切地说,当以下条件失败时:
if ((openExternalLinks && !isFileScheme && !url.isRelative())
|| (url.isRelative() && !currentURL.isRelative() && !isFileScheme))
如果不调用setSource
or change the content of the QTextDocument
,源会自动设置为点击的url。
我正在尝试设置一个 QTextBrowser,其中大多数 hyperlinks 都可以正常工作,但是以任意前缀开头的 hyperlinks 将调用一个函数。
@three-pineapples 提供了一些很好的说明 here 如何实现后一种行为,检测 url 上的前缀并调用基于该 url 的方法。
问题是,为了使其工作,必须设置 QTextBrowser 的 setOpenLinks()
方法 False
以便 QTextBrowser 发出 anchorClicked()
信号。否则,带前缀的 link 由 Qt 自动处理并且没有自定义行为。但是如果我设置 setOpenLinks() False
,正常的 links 现在不能正常工作。
关于如何在 setOpenLinks()
设置 False
的环境中重新实现 link 手动处理的任何想法,或者在前缀 link 上获得自定义行为s在设置的环境中True
?感谢您的帮助!
方法一:完全控制(但复制Qt代码)
如果您想完全控制,请使用 setOpenLinks(false)
禁用 Qt 的 link 处理机制,并根据 Qt 实现(QTextBrowserPrivate::_q_activateAnchor
完全实现 link 自己处理) 对于正常 links:
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
or open it externally using QDesktopServices::openUrl
打开 url。
方法二:综合法
使用 setOpenLinks(true)
启用 Qt 的 link 处理机制。 anchorClicked
通常会在 link 有一个文件方案时发出,或者更确切地说,当以下条件失败时:
if ((openExternalLinks && !isFileScheme && !url.isRelative()) || (url.isRelative() && !currentURL.isRelative() && !isFileScheme))
如果不调用setSource
or change the content of the QTextDocument
,源会自动设置为点击的url。