在 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> 标签?

在 Spring Data JPA 中以 3 种不同方式创建查询

moveMouseEvent 在不同小部件上的不同行为

在 UILabel 中以不同方式格式化文本

如果在 iframe 中以不同方式显示页面(css)