【问题标题】:Handling different links differently in QTextBrowser在 QTextBrowser 中以不同方式处理不同的链接
【发布时间】:2017-05-30 02:49:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: qt hyperlink pyqt qtextbrowser


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2020-08-26
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多