QMessageBox - url编码/解码

QMessageBox - url encoding/decoding

本文关键字:解码 编码 url QMessageBox      更新时间:2023-10-16

我创建了一个带有html链接的QMessageBox:

QTMessageBox msgBox(Utility::UI::topLevelWidget());
msgBox.setText("<a href="http://www.example.cz/?url=www%25www">Link</a>");
msgBox.exec();

如果我左键点击链接,一个新的网页浏览器选项卡打开。问题是url http://www.example.cz/?url=www**%2525**www被打开而不是http://www.example.cz/?url=www**%25**www

我如何防止这种行为?

更新:如果我右键单击链接,选择"复制链接"并粘贴到浏览器中,链接就可以了

这是因为%具有%25的html编码。所以%25 -> %2525

为什么Qt自动编码链接?

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

QLabel发送信号linkActivated(const QString&链接)或使用QDesktopServices::openUrl(),取决于它的布尔值openexternalllinks。

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实例。

但不幸的是,它修改了全局行为。