[英]QMessageBox - url encoding/decoding
我創建了一個帶有 html 鏈接的 QMessageBox:
QTMessageBox msgBox(Utility::UI::topLevelWidget());
msgBox.setText("<a href=\"http://www.example.cz/?url=www%25www\">Link</a>");
msgBox.exec();
如果我左鍵單擊該鏈接,則會打開一個新的 Web 瀏覽器選項卡。 問題是打開了 url http://www.example.cz/?url=www**%2525**www
而不是http://www.example.cz/?url=www**%25**www
我如何防止這種行為?
更新:如果我右鍵單擊鏈接,選擇“復制鏈接”並將其粘貼到瀏覽器中,鏈接就可以了。
那是因為%
具有 html 編碼%25
。 所以%25
-> %2525
。
為什么 Qt 會自動對鏈接進行編碼?
在 QMessageBox 中,有一個 QLabel。 標簽默認使用 Qt::TextFormat Qt::AutoText 。 因此,它會在您的文本中檢測到它是 html 編碼的並生成鏈接。
QLabel 發送信號linkActivated(const QString& link)或使用QDesktopServices::openUrl() ,具體取決於其布爾值openExternalLinks 。
似乎 QMessageBox 將openExternalLinks
設置為 true。
由於鏈接將用作QUrl 的輸入,因此將對其進行解析。 這就是雙重編碼的原因。
可以通過使用其靜態方法void QDesktopServices::setUrlHandler
來修改QDesktopServices::openUrl()
的行為。 我為所需的行為實現並測試了它:
MyUrlHandler urlHandler;
QDesktopServices::setUrlHandler( "http", &urlHandler, "handleUrl" );
QMessageBox msgBox;
msgBox.setText( "<a href=\"http://www.example.cz/?url=www%25www\">Link</a>" );
msgBox.show();
使用類MyUrlHandler
:
class MyUrlHandler : public QObject
{
Q_OBJECT
public:
MyUrlHandler(QObject* parent=0):QObject(parent){}
public slots:
void handleUrl(const QUrl &url)
{
QDesktopServices::openUrl( QUrl::fromEncoded( url.toString().toAscii() ) );
}
};
訣竅很簡單,我將鏈接地址直接設置為QUrl
實例作為已經有效的 url。
但不幸的是,它會全局修改行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.