簡體   English   中英

QMessageBox - url 編碼/解碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM