在 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。