QMessageBox - url encoding/decoding

QMessageBox - url encoding/decoding

我创建了一个带有 html link:

的 QMessageBox
QTMessageBox msgBox(Utility::UI::topLevelWidget());

msgBox.setText("<a href=\"http://www.example.cz/?url=www%25www\">Link</a>");

msgBox.exec();

如果我左键单击 link,则会打开一个新的 Web 浏览器选项卡。问题是打开 url http://www.example.cz/?url=www**%2525**www 而不是 http://www.example.cz/?url=www**%25**www

如何防止此类行为?

更新: 如果我右键单击 link,选择 "Copy link" 并将其粘贴到浏览器中,link 就可以了。

那是因为 % 有 html 编码 %25。所以 %25 -> %2525

为什么 Qt 会自动编码 links?

在QMessageBox中,有一个QLabel。标签使用 Qt::TextFormat Qt::AutoText by default。因此,它在您的文本中检测到它是 html 编码并生成 link。

QLabel 发送信号linkActivated(const QString& link) or uses QDesktopServices::openUrl(), depending its the boolean openExternalLinks

QMessageBox 似乎将 openExternalLinks 设置为 true。

由于 link 将用作 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();

使用 class 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() ) );
  }
};

技巧很简单,我将 link 地址直接设置为 QUrl 实例,因为它已经有效 url。

但不幸的是,它在全局范围内修改了行为。