在QTextBrowser中以不同方式处理不同的链接

时间:2017-05-30 02:50:00

标签: qt hyperlink pyqt qtextbrowser

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

@ three-pineapples为如何实现后一种行为,检测网址上的前缀以及根据该网址调用方法提供了一些很好的指令here

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

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

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的内容,则来源将自动设置为点击的网址。