0

我正在尝试设置一个 QTextBrowser,其中大多数超链接正常工作,但以任意前缀开头的超链接将改为调用一个函数。

@three-pineapples在这里提供了一些很好的说明,说明如何实现后一种行为,检测 url 上的前缀并基于该 url 调用方法。

问题是,为了使其工作,setOpenLinks()必须设置 QTextBrowser 的方法,False以便 QTextBrowser 发出anchorClicked()信号。否则,前缀链接将由 Qt 自动处理并且没有自定义行为。但如果我设置setOpenLinks() False,普通链接现在不能正常工作。

setOpenLinks()任何想法如何在使用set的环境中手动重新实现链接处理False,或者在设置它的环境中获取前缀链接的自定义行为True?谢谢你的帮助!

4

1 回答 1

1

方法一:完全控制(但复制Qt代码)

如果您想完全控制,请禁用 Qt 的链接处理机制,并根据普通链接setOpenLinks(false)的 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);

因此,使用打开 urlQTextBrowser::setSource或使用外部打开它QDesktopServices::openUrl

方法二:综合法

使用 . 启用 Qt 的链接处理机制setOpenLinks(true)anchorClicked当链接具有文件方案或更确切地说,当以下条件失败时,通常会发出:

if ((openExternalLinks && !isFileScheme && !url.isRelative())
    || (url.isRelative() && !currentURL.isRelative() && !isFileScheme)) 

如果不调用setSource或不更改内容QTextDocument,源会自动设置为点击的url。

于 2017-05-30T13:19:57.750 回答