2017-05-30 82 views
0

我試圖設置一個QTextBrowser,其中大多數超鏈接都能正常工作,但以任意前綴開頭的超鏈接將改爲調用一個函數。在QTextBrowser中以不同的方式處理不同的鏈接

@三菠蘿提供了一些偉大的指示here如何實現後者的行爲,檢測網址上的前綴和調用基於該網址的方法。

問題是,爲了這個工作,QTextBrowser的setOpenLinks()方法必須設置False,以便QTextBrowser將發出anchorClicked()信號。否則,前綴鏈接由Qt自動處理並且沒有自定義行爲。但是,如果我設置了setOpenLinks() False,現在正常的鏈接無法正常工作。

任何想法如何在環境中手動重新實現鏈接處理setOpenLinks()設置False,或者在設置環境的前綴鏈接上獲取自定義行爲True?謝謝你的幫助!

回答

1

方法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打開URL或外部打開我們ing QDesktopServices::openUrl

方法2:綜合方法

啓用使用setOpenLinks(true) Qt的鏈接處理機制。 anchorClicked通常將發出當鏈接有一個文件方案或更確切地說,當以下條件不滿足:

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

如果你不叫setSource或改變QTextDocument的內容,來源將被自動設置爲點擊的網址。

+0

謝謝@ m7913d!這工作就像一個魅力! – Grav

相關問題